4

md5deepで検証するために、.hashで終わるすべてのファイルを追加するスクリプトを作成しようとしています。名前にスペースが含まれているファイルは、このスクリプトを壊しているようです。

#!/bin/bash
XVAR=""
for f in *.hash
do
    XVAR="$XVAR -x $f "
done
md5deep -e $XVAR -r *

「OS.hash」というファイルを使用してスクリプトを実行すると、次のようになります。

O: No such file or directory

または に変更XVAR="$XVAR -x $f "した場合XVAR="$XVAR -x \'$f\' "XVAR="$XVAR -x \"$f\" "

md5deepは、入力を「代わりにO」として相互侵入します。

"O: No such file or directory

スクリプト内の変数のエコーは、XVARをまたはとして示し-x 'O S.hash'ます-x "O S.hash"

動作するなどのシェルでのコマンドの手動入力ですがmd5deep -e -x "O S.hash" -r *、スクリプトでコマンドが壊れているように見える場合

4

2 に答える 2

3

これは最も良い解決策ではありませんが、うまくいくようです:

find . -name '*.hash' -printf "-x\0%p\0" | xargs -0 md5deep -r * -e

これは実際にはOPが望んでいたのとまったく同じではありません.Tim PoteとJonathan Lefflerが提案した変更は次のとおりです。

find . -maxdepth 1 -name '*.hash' -printf "-x\0%p\0" | xargs -0 md5deep -r * -e
于 2012-04-29T15:20:02.910 に答える
2

これで、Unixシステムの人々が伝統的にスペースを含むファイル名(および同様にディレクトリ名)を避けていた理由がわかりました。そのような名前を処理するようにシェルをプログラムする必要があるのは(それについて丁寧に)厄介です。シェルは、そのような名前のないシステムで使用するために設計されました。改行も多くの悲しみを引き起こします。

を使用bashする場合、最善の解決策は、配列を使用して要素を保持し、次に"${array[@]}"それらをリストすることです。それはほとんど些細なことです:

declare -a XVAR

for file in *.hash
do
    XVAR+=("-x" "$file")
done

md5deep -e "${XVAR[@]}" -r *

Gordon Davissonが言及した配列拡張表記を利用します。多くの配列情報についてはリファレンスマニュアル(Bash 4.1の場合) のセクション§6.7「配列」を参照してください。演算子bashについてはセクション§3.4「シェルパラメータ」を参照してください+=。)

何らかの理由で配列を使用できない場合は、シェルが物事を歪めないように、引数をエスケープするプログラムが必要です。私はそのようなプログラムを持っていますescape

XVAR=
for file in *.hash
do
    name=$(escape "$file")
    XVAR="$XVAR -x $file"
done
eval md5deep -e $XVAR -r *

評価では、使用するのが難しいです。動作しますが、配列を使用します。

于 2012-04-29T15:35:33.700 に答える