Bash 函数处理一个目录中除目录外的所有点文件
Bash function to process all dotfiles in a directory excluding directories
我想创建一个 bash 函数来过滤选定目录中的所有点文件(无目录)。我只需要文件名,不需要完整路径。
目前,我只有这个命令:
find . -maxdepth 1 -type f -print0
打印除目录之外的所有文件。现在我仍然必须排除非点文件。所以我尝试将输出通过管道传递给 grep,如下所示:
find . -maxdepth 1 -type f -print0 | grep "^\."
而且它似乎没有用。 ->
Binary file (standard input) matches
你们有解决这个问题的优雅方法吗?
谢谢!
如果您只需要点文件:
find . -maxdepth 1 -type f -name '.*' -printf '%f[=10=]'
测试-name '.*'
选择点文件。由于 -name
接受 glob,.
表示文字句点,*
表示任意数量的任意字符。
操作 -printf '%f[=18=]'
将打印不带路径的以 NUL 分隔的文件名。
如果您的名称选择标准变得更加复杂,find 还提供 -regex
,它根据正则表达式选择文件。 GNU find 理解正则表达式的几种不同方言。这些可以用 -regextype
选择。支持的方言包括 emacs
(默认)、posix-awk
、posix-basic
、posix-egrep
和 posix-extended
。
Mac OSX 或其他 BSD 系统
BSD find
不提供 -printf
。取而代之,试试这个:
find . -maxdepth 1 -type f -name '.*' -exec basename {} \;
请注意,这对所有文件名都是安全的,即使是包含空格、制表符或换行符等难懂字符的文件名也是如此。
将点文件放入 bash 数组
如果想把所有的dot文件和目录放到一个数组中,很简单:
all=(.*).
这对所有文件名都是安全的。
如果只想获取常规文件,而不是目录,请使用 bash:
a=(); while IFS= read -r -d ''; do a+=("$(basename "$REPLY")"); done < <( find $HOME -maxdepth 1 -type f -name '.*' -print0 )
这对所有文件名也是安全的。
获取所有隐藏文件,带完整路径
find . -type f -name '.*'
仅获取隐藏文件的文件名:
for f in `find . -type f -name '.*'`; do basename "$f"; done
因为文件名可以包含白色space(空格、制表符、换行符),但是,使用更安全:
find . -type f -name '.*' -print0 | while IFS= read -r -d '' f; do basename "$f"; done
您也可以使用 bash globbing/pattern 匹配:
for f in .[^.]*; do
[ -f "$f" ] && echo "$f"
done
[^.]
是一个否定表达式,以避免匹配 .
(当前工作目录)或 ..
(父目录)。
我想创建一个 bash 函数来过滤选定目录中的所有点文件(无目录)。我只需要文件名,不需要完整路径。
目前,我只有这个命令:
find . -maxdepth 1 -type f -print0
打印除目录之外的所有文件。现在我仍然必须排除非点文件。所以我尝试将输出通过管道传递给 grep,如下所示:
find . -maxdepth 1 -type f -print0 | grep "^\."
而且它似乎没有用。 ->
Binary file (standard input) matches
你们有解决这个问题的优雅方法吗?
谢谢!
如果您只需要点文件:
find . -maxdepth 1 -type f -name '.*' -printf '%f[=10=]'
测试-name '.*'
选择点文件。由于 -name
接受 glob,.
表示文字句点,*
表示任意数量的任意字符。
操作 -printf '%f[=18=]'
将打印不带路径的以 NUL 分隔的文件名。
如果您的名称选择标准变得更加复杂,find 还提供 -regex
,它根据正则表达式选择文件。 GNU find 理解正则表达式的几种不同方言。这些可以用 -regextype
选择。支持的方言包括 emacs
(默认)、posix-awk
、posix-basic
、posix-egrep
和 posix-extended
。
Mac OSX 或其他 BSD 系统
BSD find
不提供 -printf
。取而代之,试试这个:
find . -maxdepth 1 -type f -name '.*' -exec basename {} \;
请注意,这对所有文件名都是安全的,即使是包含空格、制表符或换行符等难懂字符的文件名也是如此。
将点文件放入 bash 数组
如果想把所有的dot文件和目录放到一个数组中,很简单:
all=(.*).
这对所有文件名都是安全的。
如果只想获取常规文件,而不是目录,请使用 bash:
a=(); while IFS= read -r -d ''; do a+=("$(basename "$REPLY")"); done < <( find $HOME -maxdepth 1 -type f -name '.*' -print0 )
这对所有文件名也是安全的。
获取所有隐藏文件,带完整路径
find . -type f -name '.*'
仅获取隐藏文件的文件名:
for f in `find . -type f -name '.*'`; do basename "$f"; done
因为文件名可以包含白色space(空格、制表符、换行符),但是,使用更安全:
find . -type f -name '.*' -print0 | while IFS= read -r -d '' f; do basename "$f"; done
您也可以使用 bash globbing/pattern 匹配:
for f in .[^.]*; do
[ -f "$f" ] && echo "$f"
done
[^.]
是一个否定表达式,以避免匹配 .
(当前工作目录)或 ..
(父目录)。