ファイルが見つかったコマンドを実行します。

ファイルが見つかったコマンドを実行します。

ファイルが見つかった場所でコマンドをどのように実行できますか?次の内容で
名前が付けられたディレクトリがあるとします。testdir

$ ls -R testdir/
testdir/:
dir1  dir2  dir3  dir4  dir5

testdir/dir1:
doc1.pdf

testdir/dir2:
file1.txt

testdir/dir3:
doc2.pdf

testdir/dir4:
file2.txt

testdir/dir5:
doc5.pdf

findこれで、特定のファイル/ファイル形式が見つかったタスク(コマンドの実行)を実行したいと思います。たとえば、次のようにします*.pdf

$ find . -name '*.pdf'
./testdir/dir3/doc2.pdf
./testdir/dir5/doc5.pdf
./testdir/dir1/doc1.pdf

touch fileそれでは、上記のコマンドがファイルを検索するコマンド(例:)を実行したいとします。つまり、file少なくとも1つのディレクトリを.pdf持つすべてのディレクトリに名前付きファイルを作成して、次のようになります。

$ ls -R testdir/
testdir/:
dir1  dir2  dir3  dir4  dir5

testdir/dir1:
doc1.pdf  file

testdir/dir2:
file1.txt

testdir/dir3:
doc2.pdf  file

testdir/dir4:
file2.txt

testdir/dir5:
doc5.pdf  file

このような作業をどのように実行しますか?
おそらくファイルが見つかるたびに、cdファイルが存在する場所に移動してコマンドを繰り返し実行します。
私はそれがfind素晴らしい機能を持っていることを知っています。-execしかし、それを動作させることはできません。


これは私が何をしたいのかを理解する例です。広範囲に言うと:ファイルを再帰的に検索するコマンドをどのように実行しますかfind

答え1

このコマンドを実行すると、touch fileコマンドを起動したディレクトリでコマンドが実行されます(複数回可能です)。

find -name '*.pdf' -exec touch file \;

一方、このバリアントを実行すると、コマンドの各インスタンスがターゲットファイルのディレクトリで実行されます。

find -name '*.pdf' -execdir touch file \;

touch fileどちらの場合も、およびecho {}/またはに変更すると、実際に機能していることがわかりますpwd


マンページから:

-execdir command ;
-execdir command {} +

    に似ています-execが、指定されたコマンドは通常、起動したディレクトリではなく一致するファイルを含むサブディレクトリで実行されますfind

答え2

ディレクトリを使用してファイル名を抽出し、dirname次のようにインポートできます。

find . -name "*.pdf" -type f -exec bash myscript {} \;

ファイルにはmyscript次の内容が含まれています。

dir=$(dirname "$1")
cd "$dir"
touch file

答え3

たとえば、ファイルzshのみを選択して転送するには、glob修飾子を使用できます。.pdf修飾子ディレクトリ名を配列に保存ユニーク次に、cd各ディレクトリに移動してコマンドを実行します。これにより、コマンドを実行するだけです。一度.pdfそのディレクトリで見つかったsの数に関係なく、各ディレクトリで:

dirlist=(**/*.pdf(.:a:h))
for d in ${(u)dirlist[@]}
  (cd $d && touch file)

または

typeset -U dirlist
dirlist=(**/*.pdf(.:a:h))
for d in ${dirlist}
  (cd $d && touch file)

さらに、修飾子と修飾子を拡張子に結合し、.bkp一意のディレクトリ名を配列に保存できます。

dirlist=(**/*.bkp(D.:a:h))

答え4

以下を入力してください。

https://bitbucket.org/eradman/entr

あなたができることは、entrに指定されたディレクトリを監視させることです。 findがファイルを見つけたら、そのディレクトリで「triggerfile.txt」というファイルをタッチしてenterに引き継ぎます。

関連情報