Bash
Bash 模式匹配除目錄以外的所有文件
在 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),請使用-mindepth
and-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 限定符:
*(^/)
,或*(.)
僅匹配正常文件。