Yor*_*ork 5 bash directory filenames wildcards
在 bash 中,如何指定与当前目录中除子目录之外的所有内容匹配的模式。鉴于模式*/
匹配所有子目录,我尝试过(打开 extglob):
$ echo !(*/)
Run Code Online (Sandbox Code Playgroud)
但它没有用。
find . -maxdepth 1 ! -type d
Run Code Online (Sandbox Code Playgroud)
细节:
-maxdepth 1
限制搜索到当前目录
! -type d
消除目录
*/
匹配目录的原因是 final/
限制了对目录的匹配。此效果仅/
在模式后面的时触发,不能/
在!(*/)
. bash 中没有内置功能可以执行您想要的操作。
您可以对所有文件进行循环并构建一个数组。
non_directories=()
for x in *; do
[ -d "$x" ] || non_directories+=("$x")
done
somecommand "${non_directories[@]}"
Run Code Online (Sandbox Code Playgroud)
find
如果要对所有文件执行命令,也可以使用, 。如果您的 find 实现支持它(GNU、BSD、BusyBox),请使用-mindepth
和-maxdepth
仅列出当前目录中的条目(带有./
前置)。用! -name '.*'
省略点文件(如果你确实想忽略它们)。
find . -mindepth 1 -maxdepth 1 ! -type d -exec somecommand {} +
Run Code Online (Sandbox Code Playgroud)
如果您只能假设 POSIX find
,请使用-prune
以避免递归。
find . -name . -o -type d -prune -o -exec somecommand {} +
Run Code Online (Sandbox Code Playgroud)
如果要将 的输出填充find
到数组变量中,请注意解析 的输出find
需要对文件名进行额外假设。你最好有一个循环。
在 zsh 中,您可以使用glob 限定符: *(^/)
,或*(.)
仅匹配常规文件。