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
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
あなたがから、ファイル名にスペースを防ぐために、変数やコマンド置換、二重引用符で囲む必要引数の区切りと間違えられています。また、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
なるよう
あなたの$ 1は、その後、MVへの最初の3つの引数として使用されているE I、に展開されます。 は、この問題を解決するには、あなたがしなければならないのです引用:$ 1
mv "$1" $(echo "$1" | sed s:\ :_:g)
この試す - 純粋なbashの:
mv "$1" ${1// /_}
を