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

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

「Assignment02.cc」、「Assignment02.h」、「Assignment02.txt」などのパターンに一致するファイルのコレクションがあります。このファイルを「Assignment03.cc」、「Assignment03.txt」にコピー/名前変更したいと思います。 h '、'割り当て03.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では機能しません。

答え1

ここで 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'

答え2

君はもう複雑すぎると思った

rename 02 03 *02*

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

答え3

他のアプローチ:

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

長期的:「名前の変更」を試してください

答え4

これを行うための1つの方法は次のとおりです。

ls -1  | sed "s/\(.*\)\..*$/mv '&' '\1.txt'/" | sh

関連情報