Jea*_*ote 4 bash grep find bash-function
我正在寻找创建一个 bash 函数来过滤选定目录中的所有点文件(无目录)。我只需要文件名,而不是完整路径。
目前,我只有这个命令:
find . -maxdepth 1 -type f -print0
Run Code Online (Sandbox Code Playgroud)
打印除目录之外的所有文件。现在我仍然必须排除非点文件。所以我尝试将输出通过管道传递给 grep,如下所示:
find . -maxdepth 1 -type f -print0 | grep "^\."
Run Code Online (Sandbox Code Playgroud)
它似乎没有用。->
Binary file (standard input) matches
Run Code Online (Sandbox Code Playgroud)
你们有一个优雅的解决方案吗?
谢谢!
如果你只想要点文件:
find . -maxdepth 1 -type f -name '.*' -printf '%f\0'
Run Code Online (Sandbox Code Playgroud)
测试-name '.*'选择点文件。由于-name接受 globs,因此.表示文字句点并*表示任意数量的任意字符。
该操作-printf '%f\0'将打印不带路径的 NUL 分隔文件名。
如果您的名称选择标准变得更加复杂,find 还提供-regex基于正则表达式选择文件的功能。GNU find 理解几种不同的正则表达式方言。这些可以用 选择-regextype。支持的方言包括emacs(默认)posix-awk、posix-basic、posix-egrep、 和posix-extended。
BSDfind不提供-printf. 在它的位置,试试这个:
find . -maxdepth 1 -type f -name '.*' -exec basename {} \;
Run Code Online (Sandbox Code Playgroud)
请注意,这对所有文件名都是安全的,即使是那些包含困难字符(如空格、制表符或换行符)的文件名。
如果要将所有点文件和目录放入数组中,很简单:
all=(.*).
Run Code Online (Sandbox Code Playgroud)
这对所有文件名都是安全的。
如果您只想获取常规文件,而不是目录,请使用 bash:
a=(); while IFS= read -r -d ''; do a+=("$(basename "$REPLY")"); done < <( find $HOME -maxdepth 1 -type f -name '.*' -print0 )
Run Code Online (Sandbox Code Playgroud)
这对于所有文件名也是安全的。
| 归档时间: |
|
| 查看次数: |
718 次 |
| 最近记录: |