私はこのようなファイル(数千)のリストを持っています:
/path/2010 - filename.txt
/path/2011 - another file name.txt
常にこのパターンに従います:#### - string.txt
次のように変更する必要があります。
/path/filename (2010).txt
/path/another file name (2011).txt
bash、シェル、ターミナルなどでこれをすばやく行うにはどうすればよいですか?
コマンドを試してくださいrename:
rename -n 's/(.*) - (.*)(\.txt)/$2 ($1)$3/' *.txt
-n(--no-act)オプションはプレビュー用です。
削除-nして置換を実行します。
テストされていません。
find /path -name '???? - *.txt' -print0 | while read -d ''; do
[[ $REPLY =~ (.*)/(....)\ -\ (.*)\.txt$ ]] || continue
path=${BASH_REMATCH[1]}
year=${BASH_REMATCH[2]}
str=${BASH_REMATCH[3]}
echo mv "$REPLY" "$path/$str ($year).txt"
done
echo生成されたコマンドが正しく表示されたら削除しmvます。
私はあなたがそれをタグ付けしなかったことを知っていzshますが、あなたは言いshellました。とにかくここにzmv関数でそれを行う方法がありますzsh:
autoload zmv # It's not loaded by default
zmv -nvw '* - *.*' '$2 ($1).$3'
-n出力に満足したら削除します。
-vzmv冗長になります。-w各ワイルドカードのグループを暗黙的に作成します。
これをコメントとして追加したいのですが、まだ許可されていません。
私は同様の質問をし、ここで多くの役立つ回答を受け取りました。
https://unix.stackexchange.com/questions/37355/recursively-rename-subdirectories-that-match-a-regex
おそらく、これらのソリューションの1つは、ニーズに合わせて調整できます。