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ユーザー向けのソリューション
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/' *
この回答には、他のすべての回答の良い部分が含まれていますが、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
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
を使用すると、現在のディレクトリとその下のディレクトリが処理されます。
シェルによって異なります。 zshでは、次のようにします。
for file in ACDC*.xxx; do
mv "$file" "$(echo $file | sed -e 's/ACDC/AC-DC/')"
done
おそらく最良の解決策ではありませんが、機能します。
Bashの使用:
ls *.xxx | while read fn; do
mv "${fn}" "${fn/ACDC/AC-DC}";
done
rename
プログラムがインストールされている場合:
rename 's/ACDC/AC-DC/' *.xxx