web-dev-qa-db-ja.com

ファイル名の一括変更

画像でいっぱいのディレクトリがあります:

image0001.png
image0002.png
image0003.png
...

そして、私はそれらを(たとえば)名前を変更するワンライナーをお願いします。

0001.png
0002.png
0003.png
...

どうすればよいですか?

157
Internet man

Bashまたは他のPOSIX互換シェルを使用している場合:

for f in *.png; do
    mv -- "$f" "${f#image}"
done
110
W_Whalley

Debianとその派生物では、Perlのrenamesedと同様に機能します。

  rename -v 's/image//' *.png

代わりに、次のように機能するutil-linuxrenameもあります。

  rename image '' *.png
113
Internet man

zmv

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'

私は通常、このユースケースでニースでシンプルなmmvman page )ユーティリティを使用します。

$ mmv "image*.png" "#1.png"

タスクを実行します。

ターゲットパターンの#1は、ソースパターンのワイルドカードと一致するもので置き換えられます。これはいくつかのワイルドカードでも機能し、たとえばファイル名の部分の順序を変更するために使用できます。小文字を大文字に変換するなど、より複雑なことも簡単に実行できます。

引用することにより、シェルからパターンを確実に保護してください。

34
Marcel Stimberg

POSIX sh forループ

sedを使用して名前を変更

for i in image*jpg
do 
  mv -v "$i" "$(echo "$i" | sed -e 's/^\.\/image//' - )"
done
10
X Tian

私はPerlがとても好きです:

Perl -nlE '$old=$_; s/image//; qx(mv $old $_)'

ファイルを別のディレクトリにコピーするなど、他のタスクにも同じパターンを使用できます。

Perl -nlE '$old=$_; s(image)(/path/to/new/dir/); qx(mv $old $_)'
6
gvkv

qmv

コマンド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

6
Volker Siegel

再帰的

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
3
X Tian

シェルブレース展開 の使用:

for N in {0001..1000}; do mv "{image,}$N.png"; done
2
αғsнιη

正規表現を使用してファイル/ディレクトリの名前を安全にバッチ変更するための実用的なクロスプラットフォームのコマンドラインツールであるbrename( https://github.com/shenwei356/brename )を試してください(Windows、Linux、OS Xをサポート) )。

@ patrickDurusa が言った:

Linuxには、さまざまなバッチファイルの名前変更オプションがありますが、私から飛び出したような名前の欠点はありませんでした。

特徴:

  • クロスプラットフォーム。 Windows、Mac OS X、Linuxをサポートします。
  • 安全潜在的な競合とエラーをチェックすることによって
  • ファイルフィルタリング。正規表現によるファイルの包含と除外のサポート。 find ./ -name "*.html" -exec CMDなどのコマンドを実行する必要はありません。
  • Key-Valueファイルを介して、サブマッチの名前を対応する値に変更します。
  • 昇順の整数による名前変更。
  • ファイルとディレクトリの両方を再帰的に名前変更します
  • ドライランのサポート
  • カラフルな出力

コマンド:

$ 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
1
Wei Shen

Whileループを使用したPOSIX sh

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
1
X Tian

Windowsとlinuxの場合、これは Perlスクリプト で実行できます。この場合:

$ rnm -l 's/^image//' '*.png'

スクリプトはディレクトリの下で再帰的に実行でき、それらすべてにカウントを追加することもできます:

$ rnm -r 's/^/$counter./' '/\.png$/'

WindowsとLinuxの両方で、UTF-8文字も正しく処理されます。

1
circulosmeos

このツールを使用できます: rnmweb page

あなたの場合、コマンドは次のようになります:

rnm -rs '/^image//' *.png

さらに多くの例/ドキュメント here を見つけることができます。

0
Jahid