ループにネストされたコマンドがあり、find
出力をファイルに書き込んでリアルタイムで表示できるようにしたいです。しかし、これまで試みたすべての方法はこれを達成できませんでした。
私のwhile
コマンドは次のとおりです。
while read -r LINE; do find "$LINE" -name "*Bop*" ; done < /drives/d/dirs_to_search.txt
上記のコマンドを実行すると、一致するサブディレクトリのリストを表示できます。私の端末ウィンドウに印刷されます。欲しいこの一致リストに続く、しかし同時にファイルに書き込む。
これまで私が試した結果は、次find
のファイルに記録されましたmatched_subdirs
。
while read -r LINE; do find "$LINE" -name "*Bop*" | tee /drives/d/matched_subdirs.txt ; done < /drives/d/dirs_to_search.txt
while read -r LINE; do find "$LINE" -name "*Bop*" ; done < /drives/d/dirs_to_search.txt | tee /drives/d/matched_subdirs.txt
while read -r LINE; do find "$LINE" -name "*Bop*" -print; done < /drives/d/dirs_to_search.txt | tee /drives/d/matched_subdirs.txt
while read -r LINE; do find "$LINE" -name "*Bop*" > /drives/d/matched_subdirs.txt ; done < /drives/d/dirs_to_search.txt
while read -r LINE; do find "$LINE" -name "*Bop*"; done < /drives/d/dirs_to_search.txt > /drives/d/matched_subdirs.txt
答え1
あなたが示したコマンドしなければならない、テドンが言ったように、働く。
削除する別の方法tee
:
rm -f /drives/d/matched_subdirs.txt
while IFS= read -r pathname; do
find "$pathname" -name '*Bop*' -print \
-exec sh -c 'printf "%s\n" "$@" >>matched' sh {} +
done <dirlist
これにより、find
確認するために見つかったパス名が印刷され、埋め込みシェルスクリプトを使用して結果ファイルに書き込まれます。
出力ファイルでパス名をどのように処理するかを少し心配しています。後でループに使用する予定の場合は、find
内部で直接実行することをお勧めします。そうしないと、改行を含む奇妙なファイル名が原因で問題が発生する可能性があります。
あなたが言ったコメントからループで見つかったパス名を使用して実行しようとしていますrsync
。各パス名を呼び出すと、rsync
次のようになります。非常にゆっくりと、自分で行うことをお勧めしますrsync
。
while IFS= read -r pathname; do
rsync -avR --include='*/' --include='*Bop*' --exclude='*' --prune-empty-dirs "$pathname" target
done <dirlist
これはdirlist
あなたのディレクトリを含むファイルです。
例:
$ tree
.
|-- dirlist
`-- source
|-- a
| |-- dir-1
| | |-- somefile_Bop_here
| | `-- someotherfile
| |-- dir-2
| | |-- somefile_Bop_here
| | `-- someotherfile
| `-- dir-3
| |-- somefile_Bop_here
| `-- someotherfile
|-- b
| |-- dir-1
| | |-- somefile_Bop_here
| | `-- someotherfile
| |-- dir-2
| | |-- somefile_Bop_here
| | `-- someotherfile
| `-- dir-3
| |-- somefile_Bop_here
| `-- someotherfile
`-- c
|-- dir-1
| |-- somefile_Bop_here
| `-- someotherfile
|-- dir-2
| |-- somefile_Bop_here
| `-- someotherfile
`-- dir-3
|-- somefile_Bop_here
`-- someotherfile
13 directories, 19 files
$ cat dirlist
source/a
source/b/dir-2
(ここでループを実行してください)
$ tree target
target
`-- source
|-- a
| |-- dir-1
| | `-- somefile_Bop_here
| |-- dir-2
| | `-- somefile_Bop_here
| `-- dir-3
| `-- somefile_Bop_here
`-- b
`-- dir-2
`-- somefile_Bop_here
7 directories, 4 files
私は-R
(--relative
)を使うことにしました。それがなければ私は得るでしょう
target
|-- a
| |-- dir-1
| | `-- somefile_Bop_here
| |-- dir-2
| | `-- somefile_Bop_here
| `-- dir-3
| `-- somefile_Bop_here
`-- dir-2
`-- somefile_Bop_here