回答:
引用符を使用:
mv -- "$file" "$(echo "$file" | sed ...)"
そうでなければmv
、複数の引数が見られます。呼び出されるファイル名file name with spaces
は、の4つの引数になりmv
ます。したがって、エラー:when moving multiple files, last argument must be a directory
。ときにmv
2つの以上の引数があり、あなたが(そして、最後の引数になります)ディレクトリに複数のファイルを移動したいと仮定しています。
ただし、ファイル名の最初の5文字を削除したいようです。それは次のように簡単に行うことができますbash
:
mv -- "$file" "${file:5}"
編集:--
@ paboukのコメントのおかげで、フラグを追加しました。ダッシュで始まるファイル-
も正しく処理されます。
mv
。:)あなたはそのケースを処理しました:) ---私が意味したことはecho
それ自体の問題でした。たとえば、GNUエコー(スタンドアロンとbashビルトインの両方)は-n
、これらの文字列を出力しません:-e
と-E
。POSIXの定義に従ってもecho
、特定の状況が未定義であるため、確実に使用することはできません。XSI準拠echo
は、バックスラッシュエスケープシーケンスを解釈します。--- printf '%s\n'
このような望ましくない、実装に依存する影響はありません。
Perlと一緒に配布されることが多いprenameを使用できます。(例えば、Debianのでは/ usr / binに/ prenameがでインストールされperl
たパッケージ。)ディストリビューション(のための表情でパッケージされていない場合prename
やrename
、従来のバイナリの場所で)、それはのような、多くの場所からダウンロードできます。たとえば、ここ、ここ、またはここ。
このスクリプトは、正規表現を使用して各ファイル名と一連のファイル名に適用し、その正規表現に従ってそれらのファイルの名前を変更します。
たとえば、あなたは
prename -v -n 's/^.{5}//' *
ファイル名の最初の5文字を削除するとどうなるかを示します。名前変更を実際に実行するには、単にを削除し-n
ます。
-
。echo "$file"
使用する代わりにprintf '%s\n' "$file"
。