web-dev-qa-db-ja.com

どうすれば正規表現を使用して多くのファイルの名前を変更できますか?

Mac OS X(10.7.2)で多くのファイルの名前を変更したいのですが、renameコマンド用のPerlパッケージがありません。

私のファイルには「T452-102456-0.png」のような名前があり、「-0」の部分を削除したいと思います。私は自分のphp-cliスクリプトを作成することでこのアクションを実行できることを知っていますが、より簡単で高速なソリューションを知りたいのです。

20
Raphaël

BashまたはKshとmvを組み合わせることで解決できます。

for f in *.png; do mv -n "$f" "${f/-0}"; done

最初のダッシュの後にもファイル名に「0」があり、「-0」が常にドットの前にある場合は、式にそのドットも含めることができます。

for f in *.png; do mv -n "$f" "${f/-0./.}"; done

しかし、その名前変更ルールは単純なので、til-linuxパッケージのrenameがあれば、それもできます:

rename '-0.' '.' *.png
21
manatwork

簡単な方法:現在のディレクトリにあるファイルのみ

Zshの場合:

autoload zmv
zmv '(*)-0(.png)' '$1$2'

他のシェルの場合:

for x in *-0.png; do mv -- "$x" "${x%-0.*}.png"; done


拡張メソッド:現在のディレクトリまたはサブディレクトリ、あるいはその両方のファイル

Zshの場合:

zmv '(**/)(*)-0(.png)' '$1$2$3'

Ksh93の場合:

set -o globstar
for x in **/*-0.png; do mv -- "$x" "${x%-0.*}.png"; done

上記のbash≥4では、setコマンドの代わりにshopt -s globstarを使用します。

他のシェルの場合:

find -name '*-0.png' -exec sh -c 'for x; do mv -- "$x" "${x%-0.*}.png"; done' _ {} +

OSXのフィッシュシェルで:

for f in *.png; mv -n $f (basename $f -0.png).png; end

魚の殻: https://fishshell.com/

2
jeffmcneill

mmvパッケージがある場合:

mmv '*-0.png' '#1.png'

(最近のバージョンの)renameのように、これは既存のファイルを上書きしないように合理的な注意を払います。

0
Toby Speight