Bash函数用于处理目录中除目录之外的所有dotfiles

时间:2015-07-19 02:06:19

标签: bash grep find bash-function

我希望创建一个bash函数来过滤所选目录中的所有dotfiles(无目录)。我只需要文件名,而不是完整路径。

目前,我只有这个命令:

find . -maxdepth 1 -type f -print0 | grep "^\."

打印除dirs之外的所有文件。现在我仍然要排除非dotfiles。所以我尝试将输出传递给grep,如下所示:

Binary file (standard input) matches

它似乎没有用。 - >

<?php
session_start();

if($_SERVER["REQUEST_METHOD"]=="POST") {
    $_SESSION["data"]=array_merge($_POST['myfruit_list'],$_SESSION["data"]);
    $data = array();
    $data = $_SESSION["data"];
    $t=2;
    echo "Number of Fruit Bowls: " . count($data)/2 . "<br />";

    foreach($data as $selection => $name) {   
        if($t%2==0) {
            echo "<br>";
            echo "data : ".($t/2)." ";
        }
        else { 
            echo ",";
        }

        echo $name;
        $t++;
    }
}
else {
    $_SESSION["data"]=[];
}
?>

<form action="<?php echo $_SERVER['PHP_SELF'];?>" method="POST"> 
    <select name="myfruit_list[]">
        <option value="apples">Apples</option>
        <option value="oranges">Oranges</option>
    </select>
    <select name="myfruit_list[]">
        <option value="grapes">Grapes</option>
        <option value="pears">Pears</option>
    </select>
    <input type="submit" value="Confirm Order">
</form> 

你们有一个优雅的解决方案吗?

谢谢!

3 个答案:

答案 0 :(得分:4)

如果您只想要点文件:

find . -maxdepth 1 -type f -name '.*' -printf '%f\0'

测试-name '.*'选择点文件。由于-name接受全局,.表示字面句点,*表示任意数字的字符。

操作-printf '%f\0'将打印没有路径的NUL分隔文件名。

如果您的名称选择标准变得更加复杂,请查找提供基于正则表达式选择文件的-regex。 GNU find了解正则表达式的几种不同方言。可以使用-regextype选择这些。支持的方言包括emacs(默认),posix-awkposix-basicposix-egrepposix-extended

Mac OSX或其他BSD系统

BSD find不提供-printf。取而代之的是试试这个:

find . -maxdepth 1 -type f -name '.*' -exec basename {} \;

请注意,这对所有文件名都是安全的,即使包含空格,标签或换行符等困难字符的文件也是如此。

将点文件放入bash数组

如果你想把所有的点文件和目录都放到一个数组中,这很简单:

all=(.*).

对所有文件名都是安全的。

如果您只想获取常规文件而不是目录,请使用bash:

a=(); while IFS= read -r -d ''; do a+=("$(basename "$REPLY")"); done < <( find $HOME -maxdepth 1 -type f -name '.*' -print0 )

这对所有文件名也是安全的。

答案 1 :(得分:1)

获取所有隐藏文件,包含完整路径

find . -type f -name '.*'

只获取隐藏文件的文件名:

for f in `find . -type f -name '.*'`; do basename "$f"; done

因为文件名可以包含空格(空格,制表符,换行符),所以使用起来更安全:

find . -type f -name '.*' -print0 | while IFS= read -r -d '' f; do basename "$f"; done

答案 2 :(得分:0)

你也可以使用bash globbing / pattern matching:

for f in .[^.]*; do
    [ -f "$f" ] && echo "$f"
done

[^.]是一个否定表达式,用于避免匹配.(当前工作目录)或..(父目录)。