ファイルの一括名前変更


151

私は画像でいっぱいのディレクトリを持っています:

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

そして、ワンライナーで名前を(たとえば)に変更したいと思います。

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

どうすればいいですか?


8
これはUnixコマンドラインに関するよくある質問の1つであり、このサイトで見つけることができません。このコミュニティWikiを作成する必要がありますか。
ジル

5
理由はわかりません。これは、検証可能な回答を含む特定の質問です。
インターネット男

3
Xを実行している場合thunar -B *.png、thunarのbulk-rename guiツールを使用するよりも簡単ではありません。
dotjoe

@dotjoeありがとう、Thunarは本当に興味深い。
フォルカーシーゲル14年

回答:


106

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

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

2
これは、メンデルクーパー高度なバッシュ・スクリプティングガイドに示されているパラメータ置換法の一つであるtldp.org/LDP/abs/html
W_Whalley

2
@W_Whalley Wooledge Bash Guideを支持して、このガイドを避けることを強くお勧めします。
ワイルドカード

@Wildcard:ABSガイドを避けることを推奨する理由は何ですか?
クリスチャンセベ

@ChristianSeverinの悪い習慣と完全に壊れたコードの宣伝。プロフィールページのリンクを確認してください。
ワイルドカード

この例をさまざまなファイルパターンに適用する方法がわからない場合は、上記のガイドのパラメーター拡張セクションをご覧ください。
lex82

108

Debianとデリバティブの、Perlのrename作品は、同様にsedこれを好みます:

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

代わりにこのように機能するrenamefrom もありutil-linuxます:

  rename image '' *.png

6
これは、インストールが必要なperlプログラムであり、引数として正規表現を使用することを本当に説明する必要があります。

ああ、私はそれを知りませんでした。私はそれを特定するとき、私は正規の答えにクレジットを与えます:)
インターネット男

5
このrenameプログラムは、Perlのサンプル配布から来ました。DebianとUbuntuは、それをとして出荷してい/usr/bin/renameます。他のUnixバリアントは、それを提供しないか、まったく異なるを提供する場合があります/usr/bin/rename
ジル

1
一部のバージョンrenameテイクA から 置換パターン:rename [options] <expression> <replacement> <file>...
融合させた

1
Debianベースのシステムを使用している場合、sudo apt-get install renameを実行すると、renameコマンドを使用できます。ファイル名にはsedです。
ctrl-alt-delor

41

zmv

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'

4
sweeeeeeeeeeeeeeeeeet。私がzshを学ぶべきであるもう一つの理由。
ixtmixilix

1
@ixtmixilix何を学ぶべきですか?使い始めて、恐らくさらに素晴らしいものにするために、おそらくprezto(github.com/sorin-ionescu/prezto)を追加してください。
ジェリー

zmvの人に指摘したように本当にクールな、これはさらにに=「noglobファイルzmv -W」エイリアスMMVを追加することにより、簡素化することができます。MMV * .c.orig ORIG / * C
Bretsko

有効zmvpreztoすると、次のあなたの〜/ .zpreztorcで行のコメントを外す必要が# Set the Zsh functions to load (man zshcontrib).与えるzstyle ':prezto:load' zfunction 'zargs' 'zmv'

33

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

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

タスクを実行します。

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

引用符で囲むことで、シェルからパターンを保護してください。


このユーティリティを指摘してくれてありがとう。Debian、Ubuntu、およびCygwinリポジトリで見つけました。私はマニュアルページで問題を抱えていましたが、いくつかのウェブページとあなたがそれをどのように使用しているかを説明するのに役立つこのスタックオーバーフローの質問を見つけました。stackoverflow.com/questions/417916/how-to-do-a-mass-rename
W_Whalley

おかげで、より明確にするために回答にさらに情報を追加しました。
マルセルスティムバーグ

3
十分に支持できません!とてもシンプルでフレンドリーです。homebrewのOS Xで利用可能です。
グレッグドゥビッキ

9

POSIX sh forループ

sedを使用して名前を変更する

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

6

私はPerlが好きです。

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

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

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

2
または(安全!):rename($old,$_)
reinierpost 14

5

qmv

のコマンドqmvrenameutils、タブで区切られた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


3

再帰的

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

1

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

以下のためのWindowsとLinux、このPerlスクリプトを実行します。この場合:

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

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

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

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



0

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

@patrickDurusauは言った:

Linuxには、さまざまなバッチファイルの名前変更オプションがありますが、brenameで私に飛びついた短所はありませんでした。

特徴:

  • クロスプラットフォーム。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

-5

ls * png | 読み取り中-rf; do f2 = "` echo $ f | sed -e's / image // '`"; mv $ f $ f2; やった


何かが正しくない:「mv: 'image0001.png'の後に宛先ファイルオペランドがありません」
インターネットマン

3
コードには多くの問題があります。の出力の解析は、ls単にトラブルを引き起こしています。readする必要がありますread -r。すべての変数置換は二重引用符で囲む必要があります。
ジル

これをとしてより効果的に書くことができますfor f in *png; do f2="$(echo "$f" | sed -e 's/image//')"; mv "$f" "$f2"; done。解析lsは必要ではなく、良いアイデアでもありません
小次郎14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.