Shell

使用 -execdir 查找

  • October 21, 2020

當我跑步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'\')

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