この「検索」コマンドがすべてのディレクトリをスキャンするのはなぜですか?


-1

再帰的にスキャンしたいだけでDocuments、その「親」フォルダーを残したくない。私のスクリプトはファイルシステム全体を再帰的にスキャンしますが、このスクリプトのどの要素がそれを引き起こしているのかわかりません。これは私が持っているものです:

#/bin/sh
for f in $(find /home/rmintz/Documents/ -type f -name "*jpg")
do
  echo $f
done

このbashスクリプトがDocumentsフォルダーのみをスキャンし、他の何もスキャンしないようにするには、何を変更する必要がありますか?

ターミナルの出力がの領域外のディレクトリを表示するので、これはファイルシステム全体をスキャンしているという印象を受け/home/rmintz/Documentsます。

例は/usr/libです。


期待に反する結果の例を挙げていただけますか?
トビースパイト

私がコメントアウトした場合fi(それにif属するものがないのにそこにあるのはなぜですか?)、コードは私のために正しく動作します。
アデリー

@Adalee-fiはコメントアウトした構文の一部であり、投稿から行を削除する代わりに、誤って#を削除しました。投稿を更新しました。
user2676140

@TobySpeight-あなたの?に答えるために編集された投稿 -スキャン中にドキュメントの領域外のディレクトリが端末に出力される
-user2676140

1
スクリプトの簡単な出力例を表示できますか?「erroneou」ラインだけではありませんか?
slhck

回答:


5

アンチパターンを使用していforます。ループを使用してfindコマンドの出力を反復しないでください。これは出力の解析にls少し似ていますが、これも絶対にしないでください。

代わりに、findコマンドを実行する組み込み機能を使用します。

find /home/rmintz/Documents/ -type f -name "*jpg" -exec echo {} \;

ここで、{}は、見つかったすべてのファイルまたはディレクトリの名前に置き換えられます。

ループを使用する場合(より複雑な操作など)、各ファイルパスをNULL文字で区切る必要があります。これは-print0オプションの機能であり、その出力を使用whilereadて解析します。

find /home/rmintz/Documents/ -type f -name "*jpg" -print0 | while IFS= read -r -d '' file; do
    echo "$file"
done

それを行わず、の出力の解析に固執するfind場合、引数forは実際にはすべての空白文字で分割されます。つまり、名前にスペースが含まれるファイルは、実際にはの2つの個別のファイルとして表示されますecho。また、ファイルリストが長すぎる場合は、コマンドの最大引数サイズを超えます。これは、2番目の例でパイプが役立つ場所です。

あなたの特定の例で/usr/libは、ファイル名に実際のスラッシュが含まれている場合、たとえばファイルが呼び出された場合など、パスが出力される理由がわかりません/usr/lib foo.jpg

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.