2012-04-29 10 views
4

md5deepによって検証されるように.hashで終わるすべてのファイルを追加するスクリプトを作成しようとしています。名前にスペースがあるファイルは、このスクリプトを破るようです。私は "O S.hash" と呼ばれるファイルでスクリプトを実行するたびに、私はmd5deepのような入力を浸透しますXVAR="$XVAR -x $f "bashスクリプトのスペースをエスケープする

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

O: No such file or directory 

になるだろう

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

"O代わりに

"O: No such file or directory 

eスクリプト内の変数の町は-x 'O S.hash'または-x "O S.hash"

などmd5deep -e -x "O S.hash" -r *作品としてシェルでコマンドを手動で入力としてXVARを示していますが、そのスクリプト内のコマンドは、これは素敵なソリューションではありません

答えて

3

を破るように見える場合が、それは動作します思われる。

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

これは実際にはOPが望んでいたとまったく同じことをしないので、ティムPoteのとジョナサン・レフラーによって示唆されているように、ここで修正です:

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

'.hash'ファイルを含むサブディレクトリがある場合、これは不要なファイルがコマンドラインに表示される原因になります。 –

+0

ちょうど '-maxdepth 1'を追加してください。 –

+0

は完全に動作します:) – anselm

2

なぜUnixシステム上の人々が以前はファイル名にスペースを含むファイル名(そしてディレクトリ名も同様)を避けている理由を知っています—このような名前を処理するためにシェルをプログラムするのは迷惑です。シェルは、このような名前のないシステムで使用するために設計されています。改行も多くの悲しみを引き起こす。

bashでは、要素を保持するために配列を使用し、その後に"${array[@]}"をリストアすることをお勧めします。それはほとんど自明である。

declare -a XVAR 

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

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

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

何らかの理由で配列を使用できない場合は、引数をエスケープしてシェルが何かを歪ませないようなプログラムが必要です。私はこのようなプログラムを持って、escapeと呼ばれる:

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

のevalと、使用するのが難しいです。それは動作しますが、配列を使用します。

+1

これは、配列にエントリを追加する簡単な方法です: 'XVAR + =( - x" $ file ")' –

+0

Ah;ありがとう、@ GordonDavisson;私は何かを見落とさなければならないことを知っていましたが、私は何がわかりませんでした! Bash(4.1)リファレンスマニュアルの配列(6.7節)には '+ ='は記述されていません。あなたが '+ ='を探す必要があることを知っていれば、§3.4で述べた表記を見つけることができ、配列の振る舞いもそこに記述されています。 –

関連する問題