すべてのサブディレクトリ内のすべてのファイルに対してスキャンを実行する

すべてのサブディレクトリ内のすべてのファイルに対してスキャンを実行する

多くの質問を見ましたが、どの解決策も私には役に立ちませんでした。 cd [ディレクトリ]で指定されたすべてのサブディレクトリのすべてのファイルに対してmd5sumチェックを実行したいと思います。例:

cd [directory]

for f in *; do 
    if [[ -f "$f" ]]; then
        (md5sum -- "$f" > "md5_${f}") 
    fi
done

コメント作成者のおかげで、コマンドを実行するのではなく、ディレクトリとして提供する初期エラーを理解しました。

これで問題は、探している最初のディレクトリでは正常に実行されますが、サブディレクトリでは正しく実行されないことです。

コメントごと

find . - type f ! - name /'md5_*' -execdir sh -c /
    for f; do
         b="$(basename "$f")";
         [ ! -e "md5_$b" ] && md5sum "$b" > "md5$b"
    done


出力の検索:パスは式の前になければなりません。 - 使用法: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path.. ] [表現する]

ベストアンサー1

これは単一のコマンドで実行できますfind

find . -type f ! -name 'md5_*' -execdir sh -c \
  'for f; do
     b="$(basename "$f")"
     [ ! -e "md5_$b" ] || [ "$b" -nt "md5_$b" ] && md5sum "$b" >  "md5_$b"
   done' sh {} +

この! -name 'md5_*オプションは md5_* ファイルを除外し、この-execdirオプションを使用すると、find はファイルを含む各ディレクトリを cd し、そのディレクトリでsh -c '....'コマンドを実行します。各ディレクトリでできるだけ少ない数のコマンドを実行しますsh -c ...(システムの最大コマンドライン制限に応じて通常は1つしか実行されません。現在通常2MB以上)。

[ ! -e "md5_$b" ] || [ "$b" -nt "md5_$b" ]シェルスクリプトのテストは、md5sumファイルが存在しないか、それ自体のファイルよりも最新のファイルでのみ実行されることを確認します。md5_md5_


ディレクトリごとに1つのファイルだけが必要な場合は、md5sums.txtはるかに簡単です。

find . -type f ! -name 'md5sums.txt' -execdir sh -c \
  'md5sum "$@" >md5sums.txt' sh {} +

md5sums.txtすべてのサブディレクトリのすべてのファイルを一覧表示するファイルが必要な場合は、より簡単です。

rm -f md5sums.txt
find . -type f -exec md5sum {} + >> md5sums.txt

このバージョンは、busyboxバージョンfindと他のミニマリストバージョンと一緒に使用する必要があります。

find . -type f ! -name 'md5_*' -exec sh -c \
  'for f; do
     cd "$(dirname "$f")"
     b="$(basename "$f")"
     [ ! -e "md5_$b" ] || [ "$b" -nt "md5_$b" ] && md5sum "$b" >  "md5_$b"
     cd - >/dev/null
   done' sh {} +

シェルスクリプトでディレクトリを変更する必要があるため、少し遅くなります...そして、cd各ディレクトリに対して1回だけ実行するのではなく、各ファイルに対して2回実行する必要があります。

私はディレクトリを変更するためにpushdとを使用しますが、busybox findまたは同様のプログラムをpopd実行している場合はおそらく 。shdash

おすすめ記事