私の問題(を含むスクリプト#!/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
フラグを使用してxargs
findコマンドを実行する前に、出力ファイルを生成して追加のファイルを見つけてチェックサムを見つけました。
回避策として、チェックサムを別の場所(一時ディレクトリを介して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'
--
-