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


8

「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では使用できません。


一重引用符を二重引用符に変更します。あなたはsedコマンドの周りに単一引用符を持っている場合、$OLD_NOおよび$NEW_NO拡張されません。
Mikel

newname=$(echo $name | tr $OLD_NO $NEW_NO)
Nizam Mohamed

回答:


5

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

3

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

rename 02 03 *02*

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


renameこの構文のコマンドはLinuxユーティリティであり、OSXでは使用できません(ほとんどのDebianおよびUbuntuインストールでは、この名前でも使用できません)。
Gilles「SO-悪をやめる」

ああ、あなたはOSX上にあったけど、残念didntは
パトリック

名前の変更はperlスクリプトなので、OS Xで実行される可能性があります。google
azzid

0

別のアプローチ:

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

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


-1

あなたがそれを行うことができる1つの方法は:

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

2
の出力を解析しませんls。そして、シェルスクリプトを生成することは、頭の中で自分を撃つ確かな方法です。Vault Boyの質問には、シェル側に適切なアプローチが含まれており、正しいsedの呪文といくつかの引用がありません。
Gilles 'SO-悪をやめる'
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.