ファイル名の単語を置き換えて複数のファイルの名前を変更する方法は?


36

ACDCをAC-DCに交換

たとえば、これらのファイルがあります

ACDC-ロックンロールはノイズPollution.xxxではありません

ACDC-Rocker.xxx

ACDC-Thrill.xxxで撮影

私は彼らになりたい:

AC-DC-ロックンロールはノイズPollution.xxxではありません

AC-DC-Rocker.xxx

AC-DC-Thrill.xxxで撮影

この操作にはsedまたはawkが使用されることを知っています。私は何もグーグルできないので、あなたの助けを求めています=)このタスクのために完全に動作するシェルコマンドを提供してもらえますか?

フィードバック:OSXユーザー向けのソリューション


1
ここにはもっと大きな質問があると思います-あなたは一般的にmp3ファイル名を修正しようとしていますか?これを行うために、長年にわたって人々が書いた多くのスクリプトがあります。私が使ったものは呼ばれたと思うmp3fixer
フィルホレンバック

いいえ、ちょうど私がそれらのすべての名前を変更するため、この気の利いたソリューションを必要とするので、いくつかの巨大な似た名前のファイル、および何かすべてが交換または固定されなければならない...一般的な状況を管理するためには、約mp3の私ではないです
ホルムズ

回答:


45
rename 's/ACDC/AC-DC/' *.xxx

から man rename

DESCRIPTION
       "rename" renames the filenames supplied according to the rule specified as the 
first argument.  The perlexpr argument is a Perl expression which is expected to modify the 
$_ string in Perl for at least some of the filenames specified.  If a given filename is not 
modified by the expression, it will not be renamed.  If no filenames are given on
           the command line, filenames will be read via standard input.

たとえば、「*。bak」に一致するすべてのファイルの名前を変更して拡張子を削除するには、次のように記述します。

rename 's/\.bak$//' *.bak

大文字の名前を小文字に変換するには、次を使用します

rename 'y/A-Z/a-z/' *

5
多くのLinuxマシンには、正規表現ではなく、単純な置換を実装するutil-linuxからの名前変更が付属していることに注意してください。したがって、何もせずに名前の変更が黙って失敗した場合は、おそらく間違っrenameたを使用していることになります。
フィルホレンバック

私は何年もこれを探していました!thnx!
ホルム

@PhilHollenback正しいものを見つける/インストールする方法は?:)
ヘンリー

ファイル名にスペースではなくアンダースコアがあると機能しません-どうすれば解決できますか?
unfa

13

このような異端を残しながら、この答えは、他のすべての答えから良い部分が含まれていますls | while read

カレントディレクトリ:

for file in ACDC*.xxx; do
    mv "$file" "${file//ACDC/AC-DC}"
done

サブディレクトリを含む:

find . -type f -name "ACDC*" -print0 | while read -r -d '' file; do
    mv "$file" "${file//ACDC/AC-DC}"
done

改行文字がファイル名に含まれる可能性は非常に低いため、スペースを含む名前を使用したまま、これをより簡単にすることができます。

find . -type f -name "ACDC*" | while read -r file; do
    mv "$file" "${file//ACDC/AC-DC}"
done

9

renamePhilが参照したutil-linuxバージョンを使用するには(Ubuntuではrename.ul)と呼ばれます:

rename ACDC AC-DC ACDC*

または

rename.ul ACDC AC-DC ACDC*

1
あなたのバリアントは最高です=)googleでのfind and send and awkについての非常に多くの愚かな記事...
ホルム

4

bashシェルを使用する

find . -type f -name "ACDC*" -print0 | while read -d $'\0' f
do
   new=`echo "$f" | sed -e "s/ACDC/AC-DC/"`
   mv "$f" "$new"
done

注:を使用findすると、現在のディレクトリとその下のディレクトリが処理されます。


1

シェルに依存します。zshでは、これを行います。

for file in ACDC*.xxx; do
    mv "$file" "$(echo $file | sed -e 's/ACDC/AC-DC/')"
done

おそらく最良の解決策ではありませんが、機能します。


1

bashの使用:

ls *.xxx | while read fn; do
    mv "${fn}" "${fn/ACDC/AC-DC}";
done

renameプログラムがインストールされている場合:

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