Bash

Bash 模式匹配除目錄以外的所有文件

  • June 20, 2016

在 bash 中,如何指定與目前目錄中除子目錄之外的所有內容匹配的模式。鑑於該模式*/與所有子目錄匹配,我嘗試了(打開 extglob):

$ echo !(*/)

但它沒有用。

find . -maxdepth 1 ! -type d

細節:

  • -maxdepth 1將搜尋限制在目前目錄
  • ! -type d消除目錄

匹配目錄的原因*/是最終/限制匹配目錄。此效果僅在/模式後的 is 時觸發,您不能在 . 中使用/內括號!(*/)。bash 沒有內置功能來做你想做的事。

您可以對所有文件進行循環並建構一個數組。

non_directories=()
for x in *; do
 [ -d "$x" ] || non_directories+=("$x")
done
somecommand "${non_directories[@]}"

find如果要對所有文件執行命令,也可以使用,。如果您的 find 實現支持它(GNU、BSD、BusyBox),請使用-mindepthand-maxdepth僅列出目前目錄中的條目(帶有./前綴)。用於! -name '.*'省略點文件(如果您確實想省略它們)。

find . -mindepth 1 -maxdepth 1 ! -type d -exec somecommand {} +

如果您只能假設 POSIX find,請使用-prune以避免遞歸。

find . -name . -o -type d -prune -o -exec somecommand {} +

如果要將輸出填充find到數組變數中,請注意解析輸出find需要對文件名進行額外假設。你最好用一個循環。

在 zsh 中,您可以使用glob 限定符: *(^/),或*(.)僅匹配正常文件。

引用自:https://unix.stackexchange.com/questions/144357