ループ内で find コマンドの出力をファイルに書き込みます。

ループ内で find コマンドの出力をファイルに書き込みます。

ループにネストされたコマンドがあり、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

関連情報