Shell
使用 -execdir 查找
當我跑步
find
時,-execdir
我沒有得到我期望的結果。例如:
mkdir -p a/b/c find . -type d -execdir touch foo \; $ tree a a ├── b │ ├── c │ └── foo └── foo
目錄
c
不包含foo
文件。如何find
在每個目錄中本地訪問和執行某些操作?
對於每個匹配的文件(即每個目錄),
find
切換到包含它的目錄(即其父目錄)並執行指定的命令。由於該命令不使用匹配的名稱,因此它永遠不會作用於所有目錄。對於這個特定的目錄樹,你正在做(cd . && touch foo) # because ./a matches (cd ./a && touch foo) # because ./a/b matches (cd ./a/b && touch foo) # because ./a/b/c matches
要在每個目錄中創建一個文件,您可以簡單地使用
-exec
而不是-execdir
,前提是您在參數中實現find
了{}
allow (大多數都這樣做,尤其是我認為所有的):find . -type d -exec touch {}/foo +
對於 POSIX 可移植性,您需要手動組裝目錄名稱和文件基本名稱。
find . -type d -exec sh -c 'touch "$0/foo"' {} \;
或(稍快)
find . -type d -exec sh -c 'for d; do touch "$d/foo"; done' _ {} +
或者,您可以使用 bash 的遞歸萬用字元匹配。請注意(與 ksh 和 zsh 中的相應功能不同,並且與您的
find
命令不同)bash 在指向目錄的符號連結下遞歸。shopt -s globstar for d in **/*/; do touch -- "$d/foo"; done
zsh 解決方案:
touch ./**/(e\''REPLY+=foo'\')