2011-07-21 11 views
1
mv $1 $(echo $1 | sed s:\ :_:g) 

これは引数として渡されたファイルの名前を変更し、スペースをアンダーラインに置き換える単純なスクリプトです。私は例えば「a_e_i」に「AEI」ファイル名を変更しようとすると、しかし、それは次のエラーが返されます。ファイル名のスペースをアンダーラインに変更する簡単なbashスクリプト

./spc2und a\ e\ i 
mv: target `a_e_i' is not a directory 

答えて

7

あなたがから、ファイル名にスペースを防ぐために、変数やコマンド置換、二重引用符で囲む必要引数の区切りと間違えられています。また、bashは文字置換を単独で行うことができるので、sedは必要ありません。

mv "$1" "${1// /_}" 

編集:もう少し事がありました。まず、アンダースコア( "a_e_i"など)があるファイルがある場合に備えて、実際にはmv -iを使用してください。第2に、これは簡単なファイル名でしか動作しません。もしあなたが囲んでいるディレクトリ(例えば "foo bar/baz quux/aei")にスペースを入れたファイルパスを与えると、存在しない、喜劇につながる。その可能性のある他の変な文字があるので、これは完全に安全ではない、 -

​​

ところで、他の回答は、アンダースコアとスペースを交換した後、ファイル名を二重引用符をオフのままに:だからここに提案し、より良いバージョンですそれでも問題を引き起こす。ルール1:疑義がある場合は、安全のため二重引用符で囲みます。ルール2:疑義がある。あなたの呼び出しがこれはあなたが得るエラーメッセージの理由です

mv a e i a_e_i 

なるよう

2

あなたの$ 1は、その後、MVへの最初の3つの引数として使用されているE I、に展開されます。 は、この問題を解決するには、あなたがしなければならないのです引用:$ 1

mv "$1" $(echo "$1" | sed s:\ :_:g) 
5

この試す - 純粋なbashの:

mv "$1" ${1// /_} 
関連する問題