-execdirで検索


15

で実行するfind-execdir、期待した結果が得られません。

例えば:

mkdir -p a/b/c
find . -type d -execdir touch foo \;
$ tree a
a
├── b
   ├── c
   └── foo
└── foo

ディレクトリにファイルcが含まれていませんfoofind各ディレクトリでローカルにアクセスして何かを行うにはどうすればよいですか?

回答:


18

一致するすべてのファイル(つまり、すべてのディレクトリ)に対して、そのファイル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、引数の内部でallowの実装が提供されている場合、の代わりに単に使用findでき{}ます(ほとんどの場合、特にすべてのものを考えます)。

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'\')

参考:man bash「-c」の下の状態:command_stringの後の引数は$ 0で始まる位置パラメーターに割り当てられますが、「for d」は$ 1で始まる位置パラメーターを反復処理します。「_」は、$ 0に割り当てられるテキストであり、使用されません。
チャドスキーターズ

3

コマンドは、一致したファイルを含むすべてのディレクトリで実行されます。以来cディレクトリが含まれていません、それが一致していないので、そこに実行されることはありません。

解決策は、次のようにディレクトリ名をexecdir引数に追加することです。

find . -type d -execdir touch {}/foo \;

2

から man file

   -execdir command {} +
          Like  -exec,  but  the  specified  command is run from the subdirectory containing the matched file

一致するディレクトリcはそのbディレクトリに存在するため、そこからEXECが実行されます。ディレクトリではなくファイルを探している場合、期待どおりに動作します。

ディレクトリxargsの完全なリストが提供されるため、ディレクトリを送信することで、おそらく目的を達成できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.