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