3

私はこのようなファイル(数千)のリストを持っています:

/path/2010 - filename.txt
/path/2011 - another file name.txt

常にこのパターンに従います:#### - string.txt

次のように変更する必要があります。

/path/filename (2010).txt
/path/another file name (2011).txt

bash、シェル、ターミナルなどでこれをすばやく行うにはどうすればよいですか?

4

4 に答える 4

6

コマンドを試してくださいrename

rename -n 's/(.*) - (.*)(\.txt)/$2 ($1)$3/' *.txt

-n(--no-act)オプションはプレビュー用です。
削除-nして置換を実行します。

于 2012-08-16T15:53:11.497 に答える
3

テストされていません。

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ます。

于 2012-08-16T16:01:28.907 に答える
2

私はあなたがそれをタグ付けしなかったことを知っていzshますが、あなたは言いshellました。とにかくここにzmv関数でそれを行う方法がありますzsh

autoload zmv                      # It's not loaded by default
zmv -nvw '* - *.*' '$2 ($1).$3'

-n出力に満足したら削除します。

-vzmv冗長になります。-w各ワイルドカードのグループを暗黙的に作成します。

于 2012-08-16T16:20:25.873 に答える
1

これをコメントとして追加したいのですが、まだ許可されていません。

私は同様の質問をし、ここで多くの役立つ回答を受け取りました。

https://unix.stackexchange.com/questions/37355/recursively-rename-subdirectories-that-match-a-regex

おそらく、これらのソリューションの1つは、ニーズに合わせて調整できます。

于 2012-08-16T16:16:06.713 に答える