ファイル拡張子とテキストで検索し、バイナリファイルを同じフォルダにコピーしたいと思います。たとえば、私はディレクトリにあり、最後A
にすべての*.gdx
ファイル(B
、、、)をどこかにコピーしたいと思います。C
D
A
|-- B
| |-- file1.out (a text file)
| |-- file1.gdx (a binary file)
|
|-- C
| |-- file2.out (a text file)
| |-- file2.gdx (a binary file)
|
|-- D
| |-- file3.out (a text file)
| |-- file3.gdx (a binary file)
これは私のコードです。
cd 'find . -maxdepth 2 -name "*.out"|xargs grep "sometext"| awk -F'/' '{print $2}'|sort -u ' && ' find . -maxdepth 2 -name "*.gdx" -print0|xargs -0 cp -t /somewhere'
問題がここにある場合最初 find
複数のフォルダをキャプチャし、すべてのフォルダ内のすべてのファイルの*.gdx
代わりに最初のフォルダに1つのファイルのみをコピーします*.gdx
。ループを通して実行する必要があると思いますが、スクリプトの方法がわかりません。
答え1
そしてfind
:
find . -type f -name '*.out' -exec grep -q 'PATTERN' {} ';' \
-exec sh -c 'cp "$1" "${1%.out}.gdx" /somewhere' sh {} ';'
または:
find . -type f -name '*.out' -exec grep -q 'PATTERN' {} ';' \
-exec sh -c 'for name do cp "$name" "${name%.out}.gdx" /somewhere; done' sh {} +
現在のフォルダーまたは次のフォルダーで、同じ名前のプレフィックスを持つファイルを見つけます.out
。.out
ファイルに一致する行がある場合、ファイルPATTERN
と.gdx
同じディレクトリに同じ名前のプレフィックスを持つファイルが一緒にコピーされます。ファイルとして.out
。/somewhere
.out
/somewhere
コピーされるファイルと同じ名前の既存のディレクトリエントリがすでに存在するか、.gdx
ファイルが実際に存在するかどうかはテストされません。
また見なさい: