whitepsacesを使用して複数のファイルから特定の文字を削除する


8

ディレクトリ内の多数の音楽トラックの名前を変更しようとしていますが、次のエラーが発生しました。

複数のファイルを移動する場合、最後の引数はディレクトリでなければなりません

これはスクリプトです:

for file in * ; do
    mv $file  $(echo $file |sed 's/^.\{5\}//g')
done

これは空白のないファイルで機能しますが、このスクリプトをどのように変更しますか?

回答:


14

引用符を使用:

mv -- "$file" "$(echo "$file" | sed ...)"

そうでなければmv、複数の引数が見られます。呼び出されるファイル名file name with spacesは、の4つの引数になりmvます。したがって、エラー:when moving multiple files, last argument must be a directory。ときにmv2つの以上の引数があり、あなたが(そして、最後の引数になります)ディレクトリに複数のファイルを移動したいと仮定しています。


ただし、ファイル名の最初の5文字を​​削除したいようです。それは次のように簡単に行うことができますbash

mv -- "$file" "${file:5}"

編集--@ paboukのコメントのおかげで、フラグを追加しました。ダッシュで始まるファイル-も正しく処理されます。


2
で始まるファイル名では機能しない場合があります-echo "$file"使用する代わりにprintf '%s\n' "$file"
pabouk

忘れてたmv。:)あなたはそのケースを処理しました:) ---私が意味したことはechoそれ自体の問題でした。たとえば、GNUエコー(スタンドアロンとbashビルトインの両方)は-n、これらの文字列を出力しません:-e-E。POSIXの定義に従ってもecho、特定の状況が未定義であるため、確実に使用することはできません。XSI準拠echoは、バックスラッシュエスケープシーケンスを解釈します。--- printf '%s\n'このような望ましくない、実装に依存する影響はありません。
pabouk 2015年

3

Perlと一緒に配布されることが多いprenameを使用できます。(例えば、Debianのでは/ usr / binに/ prenameがでインストールされperlたパッケージ。)ディストリビューション(のための表情でパッケージされていない場合prenamerename、従来のバイナリの場所で)、それはのような、多くの場所からダウンロードできます。たとえば、ここここ、またはここ

このスクリプトは、正規表現を使用して各ファイル名と一連のファイル名に適用し、その正規表現に従ってそれらのファイルの名前を変更します。

たとえば、あなたは

prename -v -n 's/^.{5}//' *

ファイル名の最初の5文字を​​削除するとどうなるかを示します。名前変更を実際に実行するには、単にを削除し-nます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.