私は画像でいっぱいのディレクトリを持っています:
image0001.png
image0002.png
image0003.png
...
そして、ワンライナーで名前を(たとえば)に変更したいと思います。
0001.png
0002.png
0003.png
...
どうすればいいですか?
thunar -B *.png
、thunarのbulk-rename guiツールを使用するよりも簡単ではありません。
私は画像でいっぱいのディレクトリを持っています:
image0001.png
image0002.png
image0003.png
...
そして、ワンライナーで名前を(たとえば)に変更したいと思います。
0001.png
0002.png
0003.png
...
どうすればいいですか?
thunar -B *.png
、thunarのbulk-rename guiツールを使用するよりも簡単ではありません。
回答:
Bashまたは他のPOSIX互換シェルを使用している場合:
for f in *.png; do
mv -- "$f" "${f#image}"
done
Debianとデリバティブの、Perlのrename
作品は、同様にsed
これを好みます:
rename -v 's/image//' *.png
代わりにこのように機能するrename
from もありutil-linux
ます:
rename image '' *.png
rename
プログラムは、Perlのサンプル配布から来ました。DebianとUbuntuは、それをとして出荷してい/usr/bin/rename
ます。他のUnixバリアントは、それを提供しないか、まったく異なるを提供する場合があります/usr/bin/rename
。
rename
テイクA から の置換パターン:rename [options] <expression> <replacement> <file>...
zshシェルには、という強力なバッチ名前変更コマンドがありzmv
ます。
まずzmv
、次のようにコマンドを有効にする必要があります(これはに入ることができます~/.zshrc
)。
autoload zmv
基本的な構文はzmv PATTERN REPLACEMENT
です。パターンはシェルグロブ式です。パターンの一部を括弧で囲むことができます。置換テキストを含めることができ$1
、$2
パターンでN番目の括弧のグループを参照するなど、。例えば:
zmv 'image(*.png)' '$1'
また、自動的に定義することのzshを求めることができ$1
、$2
パターン内のワイルドカード文字を一致させるなど、:
zmv -w 'image*.png' '$1.png'
私は通常、このユースケースには素敵でシンプルなmmv(manページ)ユーティリティを使用します。
$ mmv "image*.png" "#1.png"
タスクを実行します。
#1
ターゲットパターンでは、ソースパターンにワイルドカードに一致するものは何でもで置換されます。これはいくつかのワイルドカードでも機能し、たとえばファイル名の一部の順序を変更するために使用できます。小文字を大文字に変換するなど、より複雑なことも簡単に行えます。
引用符で囲むことで、シェルからパターンを保護してください。
私はPerlが好きです。
perl -nlE '$old=$_; s/image//; qx(mv $old $_)'
ファイルを別のディレクトリにコピーするなど、他のタスクにも同じパターンを使用できます。
perl -nlE '$old=$_; s(image)(/path/to/new/dir/); qx(mv $old $_)'
rename($old,$_)
のコマンドqmv
はrenameutils
、タブで区切られた2つの列を持つファイル名のリストを表示するエディターを開きます。各行には、両方の列で同じファイル名のいずれかが表示されます。右側の列は、ファイルの新しい名前を表しています。
変更するには、右側の名前を編集します。この例では:%s/...
、視覚的なブロックモードが役立ちます。
$ qmv *.png
エディターで:
image0001.png image0001.png
image0002.png image0002.png
image0003.png image0003.png
~
~
~
~
"/tmp/user/1000/qmvxWyVMs" 3L, 93C
右の列の名前を編集:(ビジュアルブロックモードを使用してすべての行からプレフィックスを
削除image
)
image0001.png 0001.png
image0002.png 0002.png
image0003.png 0003.png
~
~
~
~
:wq
名前変更のログ:
image0001.png -> 0001.png
image0002.png -> 0002.png
image0003.png -> 0003.png
(例えばUbuntuの:apt-get install renameutils
)
image * pngファイルを簡単に選択し、ファイル名の改行を扱う必要がないと仮定します
find . -name "image*.png" | while read f; do mv -v "$f" "$(echo "$f" | sed -e 's/^\.\/image//' - )"; done
安全で、スペース、改行、バックスラッシュなどに対処できます:
find . -name "image*.png" | while IFS= read -r f; do
mv -v "$f" "$(echo "$f" | sed -e 's/^\.\/image//' - )";
done
以下のためのWindowsとLinux、このPerlスクリプトを実行します。この場合:
$ rnm -l 's/^image//' '*.png'
スクリプトは、ディレクトリの下で再帰的に実行でき、それらすべてにカウントを追加することもできます。
$ rnm -r 's/^/$counter./' '/\.png$/'
UTF-8文字もWindowsとLinuxの両方で正しく処理されます。
brename(https://github.com/shenwei356/brename)を試してください。これは、正規表現(Windows、Linux、およびOS Xをサポート)を使用してファイル/ディレクトリの名前を安全に一括変更するための実用的なクロスプラットフォームコマンドラインツールです。
@patrickDurusauは言った:
Linuxには、さまざまなバッチファイルの名前変更オプションがありますが、brenameで私に飛びついた短所はありませんでした。
特徴:
find ./ -name "*.html" -exec CMD
。コマンド:
$ brename -f .png -p image
[INFO] checking: [ ok ] 'image0001.png' -> '0001.png'
[INFO] checking: [ ok ] 'image0002.png' -> '0002.png'
[INFO] checking: [ ok ] 'image0003.png' -> '0003.png'
[INFO] 3 path(s) to be renamed
[INFO] renamed: 'image0001.png' -> '0001.png'
[INFO] renamed: 'image0002.png' -> '0002.png'
[INFO] renamed: 'image0003.png' -> '0003.png'
[INFO] 3 path(s) renamed
ls * png | 読み取り中-rf; do f2 = "` echo $ f | sed -e's / image // '`"; mv $ f $ f2; やった
ls
単にトラブルを引き起こしています。read
する必要がありますread -r
。すべての変数置換は二重引用符で囲む必要があります。
for f in *png; do f2="$(echo "$f" | sed -e 's/image//')"; mv "$f" "$f2"; done
。解析ls
は必要ではなく、良いアイデアでもありません。