
ディレクトリ内の複数の音楽トラックの名前を変更しようとすると、次のエラーが発生します。
複数のファイルを移動する場合、最後のパラメータはディレクトリでなければなりません。
スクリプトは次のとおりです。
for file in * ; do
mv $file $(echo $file |sed 's/^.\{5\}//g')
done
これは空白のないファイルに適用されます。このスクリプトをどのように修正しますか?
答え1
引用符を使用する:
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}"
編集する:ロゴを追加しました--
。 @コメントありがとうございます。パブク。ダッシュで始まるファイル-
も正しく処理されます。
答え2
通常、Perl と共に配布される prename を使用できます。 (たとえば、Debianでは/usr/bin/prenameがパッケージによってインストールされますperl
。)ディストリビューションがパッケージされていない場合(通常のバイナリの場所を見つけてprename
)rename
、次のようないくつかの場所からダウンロードできます。ここ、ここまたはここ。
スクリプトは正規表現を取得し、それらを各ファイル名とファイル名のセットに適用し、その正規表現に基づいてそのファイルの名前を変更します。
たとえば、次のようにできます。
prename -v -n 's/^.{5}//' *
ファイル名の最初の5文字を削除すると、何が起こるのかがわかります。実際に名前を変更するには-n
。