検索| xargs shasumはチェックサムファイル自体のチェックサムを(早期に)生成し、チェックに失敗します。

検索| xargs shasumはチェックサムファイル自体のチェックサムを(早期に)生成し、チェックに失敗します。

私の問題(を含むスクリプト#!/bin/sh)は次のとおりです。アーカイブのためにディレクトリ内のすべてのファイルをチェックサムしようとしています。すべてのファイル名のチェックサム(私の場合はsha1)を含むファイルは同じディレクトリになければなりません。~/testファイルf1と:を含むディレクトリがあるとしますf2

mkdir ~/test
cd ~/test
echo "hello" > f1
echo "world" > f2

それではチェックサムを計算してみてください。

find -maxdepth 1 -type f -printf '%P\n' | xargs shasum

正確に私が望むのは、現在のディレクトリ内のすべてのファイルを一覧表示し、sha1合計を計算することです(最大深度は後で変更される可能性があります)。 STDOUTの出力は次のとおりです。

f572d396fae9206628714fb2ce00f72e94f2258f  f1
9591818c07e900db7e1e0bc4b884c945e6a61b24  f2

残念ながらファイルとして保存しようとすると

find -maxdepth 1 -type f -printf '%P\n' | xargs shasum > sums.sha1

生成されたファイルには独自のチェックサムが表示されます。

da39a3ee5e6b4b0d3255bfef95601890afd80709  sums.sha1
f572d396fae9206628714fb2ce00f72e94f2258f  f1
9591818c07e900db7e1e0bc4b884c945e6a61b24  f2  

shasum --checkしたがって、最後の金額を保存すると、追加のファイルの変更に明らかな問題があるため、後で失敗します。

周りを見回して、-pフラグを使用してxargsfindコマンドを実行する前に、出力ファイルを生成して追加のファイルを見つけてチェックサムを見つけました。

回避策として、チェックサムを別の場所(一時ディレクトリを介してmktemp)に保存したり、検索から特に除外したりすることがわかりますが、なぜそれが機能するのかを理解したいと思います。役に立たないようです。たとえば、最初のコマンドが出力ファイルがすでにディスクにあるかどうかを確認した場合、正解は得られません。

ベストアンサー1

以下を使用してファイルが到着するのを防ぎますxargs

find . -maxdepth 1 -type f ! -name sums.sha1 -printf '%P\n' |
  xargs -r shasum -- > sums.sha1

スペース、改行、引用符、またはバックスラッシュを含むファイル名に関する問題を回避するには、次のようにします。

find . -maxdepth 1 -type f ! -name sums.sha1 -printf '%P\0' |
  xargs -r0 shasum -- > sums.sha1

代わりに。

これはで--始まらないためです-。しかし--print0-printf '%P\0'---

おすすめ記事