画像でいっぱいのディレクトリがあります:
image0001.png
image0002.png
image0003.png
...
そして、私はそれらを(たとえば)名前を変更するワンライナーをお願いします。
0001.png
0002.png
0003.png
...
どうすればよいですか?
Bashまたは他のPOSIX互換シェルを使用している場合:
for f in *.png; do
mv -- "$f" "${f#image}"
done
Debianとその派生物では、Perlのrename
はsed
と同様に機能します。
rename -v 's/image//' *.png
代わりに、次のように機能するutil-linux
のrename
もあります。
rename image '' *.png
Zshシェルには、zmv
と呼ばれる強力なバッチ名前変更コマンドがあります。
まず、次のようにzmv
コマンドを有効にする必要があります(これは~/.zshrc
に入る可能性があります)。
autoload zmv
基本的な構文はzmv PATTERN REPLACEMENT
です。パターンはシェルのグロブ式です。パターンの一部を括弧で囲むことができます。置換テキストには、$1
、$2
などを含めて、パターン内のN番目の括弧で囲まれたグループを参照できます。例えば:
zmv 'image(*.png)' '$1'
パターンのワイルドカード文字と一致するように$1
、$2
などを自動的に定義するようにzshに要求することもできます。
zmv -w 'image*.png' '$1.png'
私は通常、このユースケースでニースでシンプルなmmv( man page )ユーティリティを使用します。
$ mmv "image*.png" "#1.png"
タスクを実行します。
ターゲットパターンの#1
は、ソースパターンのワイルドカードと一致するもので置き換えられます。これはいくつかのワイルドカードでも機能し、たとえばファイル名の部分の順序を変更するために使用できます。小文字を大文字に変換するなど、より複雑なことも簡単に実行できます。
引用することにより、シェルからパターンを確実に保護してください。
sedを使用して名前を変更
for i in image*jpg
do
mv -v "$i" "$(echo "$i" | sed -e 's/^\.\/image//' - )"
done
私はPerlがとても好きです:
Perl -nlE '$old=$_; s/image//; qx(mv $old $_)'
ファイルを別のディレクトリにコピーするなど、他のタスクにも同じパターンを使用できます。
Perl -nlE '$old=$_; s(image)(/path/to/new/dir/); qx(mv $old $_)'
コマンドqmv
from renameutils
は、タブで区切られた2つの列を持つファイル名のリストを表示するエディターを開きます。各行には、両方の列で同じファイル名の1つが表示されます。右側の列は、ファイルの新しい名前を表しています。
変更するには、右側の名前を編集します。この例では、:%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
シェルブレース展開 の使用:
for N in {0001..1000}; do mv "{image,}$N.png"; done
正規表現を使用してファイル/ディレクトリの名前を安全にバッチ変更するための実用的なクロスプラットフォームのコマンドラインツールであるbrename( https://github.com/shenwei356/brename )を試してください(Windows、Linux、OS Xをサポート) )。
@ patrickDurusa が言った:
Linuxには、さまざまなバッチファイルの名前変更オプションがありますが、私から飛び出したような名前の欠点はありませんでした。
特徴:
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
find
コマンドから名前を読み取ります。
find . -maxdepth 1 -type f -name 'image*png' | while IFS= read -r f; do
mv -v "$f" "$(echo "$f" | sed -e 's/^\.\/image//' - )"
done
ファイルから名前を読み取る
while IFS= read -r f; do mv -v "$f" "$(echo "$f"|sed -e 's/^\.\/image//' - )"; done < flist
Windowsとlinuxの場合、これは Perlスクリプト で実行できます。この場合:
$ rnm -l 's/^image//' '*.png'
スクリプトはディレクトリの下で再帰的に実行でき、それらすべてにカウントを追加することもできます:
$ rnm -r 's/^/$counter./' '/\.png$/'
WindowsとLinuxの両方で、UTF-8文字も正しく処理されます。