0

アイデアは、ディレクトリ内のすべてのファイル (すべてのサブディレクトリを含む) の SHA256 ハッシュを計算しますが、別のテキスト ファイルで指定されたいくつかのファイルを除外することです。

問題は、次のファイル (コードの下を参照) を除外するように指定すると、両方ではなく 1 つのみが除外されることです。

これが私のコードです:

while read line
do
    if [ $line_count -eq 0 ]
    then
        exclude_files=".*/$line$"
    else
        exclude_files="${exclude_files}\|.*/$line$"
    fi

    line_count=$(( $line_count + 1 ))
done < exclude-files.txt

find . -type f -print0 | xargs -0 shasum -a 256 | grep -v -P "${exclude_files}" > ~/out.txt

ファイルの内容exclude-files.txt:

Icon\\r
.DS_Store
--- empty line ---

このファイルIcon\rは、フォルダのアイコンを変更するための特別なファイルで、その名前にはCR. (私は Mac OS X 10.7.4 を使用しています)

4

2 に答える 2

2

これは、変数内で次の\エスケープ記号として認識されるためです|

exclude_files="${exclude_files}\|.*/$line$"

\あなたはそれを機能させるために脱出するために別のものを追加する必要があります\

exclude_files="${exclude_files}\\|.*/$line$"

また、-Pでオプションを使用していますgrep。この場合、エスケープする必要はありません|。したがって、バックスラッシュなしで使用します。

使用する方法を選択する必要があります:エスケープまたは-P。両方一緒にそれらは動作しません。

于 2012-06-29T10:17:38.283 に答える
0

ファイル名に特別な意味を持つ文字が含まれている場合、grepは安全ではありません。これが役立つかもしれません

cmd=(find . -type f \( )
while read line;do cmd=("${cmd[@]}" \! -name "$line" -a);done < exclude-files.txt
cmd[${#cmd[*]}-1]=\)
echo "${cmd[@]}" | cat -v
"${cmd[@]}" -print0 | xargs -0 shasum -a 256
于 2012-06-29T11:15:47.423 に答える