リストから欠落しているファイルを見つける方法は?

リストから欠落しているファイルを見つける方法は?

ファイルリストがあり、そのファイルが私のファイルシステムにあることを確認したいと思います。find次の方法を使用してこれを実行したいと思います。

for f in $(cat file_list); do
find . -name $f > /dev/null || print $f
done

(を使用して)がファイルが見つからないか見つからないか終了するzshため、機能しません。他のテストで出力が生成されているかどうかをテストできると思います(粗いですが効果的な方法はで置き換えることです)。しかし、これはトロールを使ってヤギを捕まえるのと同じ感じです(他の国では大きなハンマーとクルミの問題について話すことができます)。find0find> /dev/null|grep ''

find有用な終了値を強制的に適用する方法はありますか?または、少なくともそのファイルのリストを入手してください。いいえ確立されたか。 (どんな賢い論理的な接続の単語を選択すると、後者がより簡単になる可能性があると想像できますが、それを理解しようとすると常に詰まっているようです)。

背景/同期:「マスター」バックアップがあり、それを削除する前に(少しのスペースを作成するために)、ローカルシステム上の特定のファイルがマスターバックアップにあることを確認したいと思います。そのため、ファイルのリストを作成しsshてホストに編集し、見つからないファイルを見つけるための最良の方法が何であるかを考えました。

ベストアンサー1

これを使用して、statファイルシステムにファイルが存在するかどうかを確認できます。

組み込みのものを使用する必要があります。シェル機能ファイルが存在するかどうかをテストします。

while read f; do
   test -f "$f" || echo $f
done < file_list

「テスト」はオプションで、スクリプトは実際にはそれなしで動作しますが、読みやすくするためにそのままにしています。

編集する:パスなしでファイル名のリストを処理するしかない場合は、findを使用してファイルのリストを一度作成してから、grepを使用して繰り返し、その中にどのファイルがあるかを調べることをお勧めします。

find -type f /dst > $TMPFILE
while read f; do
    grep -q "/$f$" $TIMPFILE || echo $f
done < file_list

気づく:

  • ファイルリストには、ディレクトリではなくファイルのみが含まれます。
  • grep 一致パターンのスラッシュは、部分ファイル名ではなく完全なファイル名を比較するためのものです。
  • 検索パターンの最後の「$」は行末を一致させるために使用されるため、ディレクトリ一致は取得できず、完全なファイル名パッチのみを取得できます。

おすすめ記事