「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