多くの質問を見ましたが、どの解決策も私には役に立ちませんでした。 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
実行している場合はおそらく 。sh
dash
答え2
これはaのすべてのファイルを見つけて/dir
実行します。md5sum /dir/file
find /path/to/directory -type f -print0 | xargs -0I{} md5sum {}
答え3
これは仕事のようですfind
。
find /directory -type f -exec sh -c 'a={}; md5sum -- $a > $a.md5' \;