web-dev-qa-db-ja.com

ファイル名のWordを置き換えることによって複数のファイルの名前を変更する方法は?

ACDCをAC-DCに置き換える

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

ACDC-Rock N 'Roll Ai n't Noise Pollution.xxx

ACDC-Rocker.xxx

ACDC-Thrill.xxxにシュート

私は彼らになってほしい:

AC-DC-Rock N 'Roll Ai n't Noise Pollution.xxx

AC-DC-Rocker.xxx

AC-DC-Shoot to Thrill.xxx

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

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

37
holms
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/' *
46
Joel K

この回答には、他のすべての回答の良い部分が含まれていますが、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

改行文字はreallyはファイル名に含まれる可能性が低いため、スペースを含む名前を操作する場合は、これがより簡単になります。

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

Philが言及したutil-linuxバージョンのrenameを使用するには(Ubuntuではrename.ul):

rename ACDC AC-DC ACDC*

または

rename.ul ACDC AC-DC ACDC*

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を使用すると、現在のディレクトリとその下のディレクトリが処理されます。

4
Ring Ø

シェルによって異なります。 zshでは、次のようにします。

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

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

1
polemon

Bashの使用:

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

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

rename 's/ACDC/AC-DC/' *.xxx
1
ThatGraemeGuy