Bash 模式匹配除目录之外的所有文件

Yor*_*ork 5 bash directory filenames wildcards

在 bash 中,如何指定与当前目录中除子目录之外的所有内容匹配的模式。鉴于模式*/匹配所有子目录,我尝试过(打开 extglob):

$ echo !(*/)
Run Code Online (Sandbox Code Playgroud)

但它没有用。

Joh*_*024 6

find . -maxdepth 1 ! -type d
Run Code Online (Sandbox Code Playgroud)

细节:

  • -maxdepth 1 限制搜索到当前目录

  • ! -type d 消除目录


Gil*_*il' 6

*/匹配目录的原因是 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 限定符: *(^/),或*(.)仅匹配常规文件。