4

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

目前,我只有这个命令:

find . -maxdepth 1 -type f -print0

它打印除目录之外的所有文件。现在我仍然必须排除非点文件。因此,我尝试将输出通过管道传输到 grep,如下所示:

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

它似乎没有用。->

Binary file (standard input) matches

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

谢谢!

4

3 回答 3

5

如果你只想要点文件:

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

测试-name '.*'选择点文件。由于-name接受 glob,因此.表示文字句点并*表示任意数量的任意字符。

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

如果您的名称选择标准变得更加复杂,find 还提供-regex基于正则表达式选择文件的功能。GNU find 可以理解正则表达式的几种不同方言。这些可以用 选择-regextype。支持的方言包括(emacs默认)posix-awk、、、、posix-basic和。posix-egrepposix-extended

Mac OSX 或其他 BSD 系统

BSDfind不提供-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 )

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

于 2015-07-19T02:15:53.383 回答
1

您还可以使用 bash 通配符/模式匹配:

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

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

于 2015-07-19T04:49:09.330 回答
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
于 2015-07-19T02:22:27.547 回答