web-dev-qa-db-ja.com

ディレクトリ内のファイルのsha1sum

ディレクトリ内の各ファイルのsha1sumとファイルのフルパスを返すスクリプトがあります。

for i in /path/to/directory*.*; do sha1sum $i >> checksums.txt; done

返却値:

sha1sum  /path/to/directory/filename
sha1sum  /path/to/directory/filename2
sha1sum  /path/to/directory/filename3

出力にsha1sumとファイル名のみが含まれるようにこれを変更するにはどうすればよいですか。ファイルのフルパスを印刷したくありません。

sha1sum $i | awk '{print $1}'を使用する方法がわかりますが、ファイル名のみを取得する方法がわかりません

4
user627497

私見では、最も簡単なアプローチは、サブシェルで最初にディレクトリに変更することです:

(cd /path/to/directory ; for i in *.*; do sha1sum "$i" ; done) >> checksums.txt

*.*は「ドット拡張子」を持つファイルにのみ一致することに注意してください。チェックサムallファイルには、*を使用してください


awkルートへの移動を選択した場合、1つのアプローチはsub2番目のフィールドの/までの最長部分文字列を設定することです。

for i in /path/to/directory/*.*; do sha1sum $i ; done | awk '{sub(/.*\//,"",$2)} 1' >> checksums.txt
4
steeldriver

findコマンドと-execフラグを次のように使用します。

$ find ./TESTDIR -type f -printf "%f\t" -exec bash -c 'sha256sum "$@" | awk "{print \$1}"' sh "{}" \; 
out.txt cc29e205d04a4062d0fb131700e8bfc8e54c44d0176a8dca22f40b24ef26d325
2.txt   f2ca1bb6c7e907d06dafe4687e579fce76b37e4e93b7605022da52e6ccc26fd2
with space.txt  e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
script.pl   e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
3.txt   f2ca1bb6c7e907d06dafe4687e579fce76b37e4e93b7605022da52e6ccc26fd2
Steam_locomotive    e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
storm carl  e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
1.txt   f2ca1bb6c7e907d06dafe4687e579fce76b37e4e93b7605022da52e6ccc26fd2
sal e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
simple_curl e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

これが機能する方法は、-printf "%f\t"フラグを使用して最初にbasenameを出力し、-execフラグ内でシェルを実行し、実際のファイルパスをコマンドライン引数としてシェル自体に渡すことです。

これは少し複雑に見えますが、これはfindコマンドに渡される任意のパスで機​​能するため、ファイルシステムの周りでcdを使用する必要はありません。

-printfフラグと-execフラグの位置を逆にする上記のコマンドのバリエーションを使用して、より良いフォーマットを実現できます。

$ find ./TESTDIR -type f -exec bash -c "sha256sum '{}' | awk '{printf  \"%s\t\",\$1}' " \; -printf "%f\n"
cc29e205d04a4062d0fb131700e8bfc8e54c44d0176a8dca22f40b24ef26d325    out.txt
f2ca1bb6c7e907d06dafe4687e579fce76b37e4e93b7605022da52e6ccc26fd2    2.txt
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855    with space.txt
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855    script.pl
f2ca1bb6c7e907d06dafe4687e579fce76b37e4e93b7605022da52e6ccc26fd2    3.txt
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855    Steam_locomotive
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855    storm carl
f2ca1bb6c7e907d06dafe4687e579fce76b37e4e93b7605022da52e6ccc26fd2    1.txt
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855    sal
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855    simple_curl
2