web-dev-qa-db-ja.com

正規表現を使用して複数のファイルをコピー/名前変更(シェルスクリプト)

「assignment02.cc」、「assignment02.h」、「assignment02.txt」などのパターンに一致するファイルのコレクションがあります。これらのファイルを「assignment03.cc」、「assignment03」にコピー/名前変更したいと思います。 h '、' assignment03.txt 'など。

これはシェルスクリプトを使用して簡単にでき、sedである必要があると思います。これまでのところ:

OLD_NO=$1
NEW_NO=$2

echo "Moving from $OLD_NO to $NEW_NO"

for name in assignment$OLD_NO.* ; do
  newname=$(echo $name | sed 's/\(.*\)$OLD_NO\(.*\)/\1xx$NEW_NO\2/')
  echo "$name -> $newname"
  # mv -v $name $newname
done

残念ながら、sedを呼び出す方法では常に入力文字列$nameが返され、実際には正規表現による検索/置換は行われません。

注:インターネットを見ると、この機能を持つrenameコマンドがありますが、私のMacBookでは使用できません。

8
user4632

ここでsedを使用すると、必要以上に複雑になります。シェルの組み込みのテキスト操作機能を使用します。たとえば、${name#assignment02}は、assignment02から接頭辞$nameを削除します。

for name in assignment02.*; do
  mv "$name" "assignment03${name#assignment02}"
done

ファイル名にシェルの特殊文字が含まれていないことが確実な場合は、二重引用符は必要ありません。

利用可能なzshがある場合、そのzmv関数は、このような種類の名前変更に役立ちます。

autoload zmv
zmv '(assignment)02.(*)' '${1}03.$2'

あなたはすでに複雑すぎると考えています

rename 02 03 *02*

'rename'は、arg3以降で指定されたすべてのファイルの名前の最初の引数( '02')を2番目の引数( '03')で置き換えます(* 02 *)

3
Patrick

別のアプローチ:

for ext in {cc,h,txt}
do 
  echo mv assignment02.$ext assignment03.$ext
done

長期的には、「名前を変更」してみてください

0
user unknown