コマンドラインを使用して複数のファイルの名前を簡単に変更するにはどうすればよいですか?


103

Windowsでファイルの名前をすばやく変更する方法の1つは

F2 > Rename > Tab (to next file) > Rename ...

しかし、Ubuntu / Nautilusでは、次のファイルに移動できません。しかし、Linux上では、コマンドラインの代替手段が必要だと思います。

ただし、特定のファイルの名前を変更する方法をより詳細に制御したい場合があります。その場合、おそらく次のファイルにタブで移動できる方が良いでしょう


1
「より多くの制御」を定義できますか?あなたが正確に求めているのかわからない...
ダンKhoa

この質問には答えられていないと思います。あなたが求めているもの(F2とF2モードで次のファイルにジャンプする)は現在Nautilusでは利用できないと思います。
don.joey

回答:


189

私はrenameいつも使っています。それはかなり単純ですが、できれば基本的な正規表現を知っていることを願っています:

rename "s/SEARCH/REPLACE/g"  *

これSEARCHによりREPLACE、すべてのファイルで文字列が置き換えられます(つまり、*)。/gあなたが持っていたので、もしグローバルな手段は、SEARCH_SEARCH.jpgそれは名前を変更されるだろうREPLACE_REPLACE.jpg。持っていなかった場合/g、置換は一度しか行われなかったため、という名前になりREPLACE_SEARCH.jpgます。大文字と小文字を区別しない場合は、追加します/i(つまり、/giまたは/ig最後に追加します)。

正規表現を使用すると、さらに多くのことができます。

これは完全なPerl正規表現をサポートrenameするprename(Perl とも呼ばれるrename)コマンドであることに注意してください。renameパターンを使用する別の方法があり、それほど強力ではありません。prename以前はUbuntuにデフォルトで(Perlと一緒に)インストールされていましたが、現在は次のようにする必要があります。

sudo apt install rename

以下に例を示します。

プレフィックス

追加

rename 's/^/MyPrefix_/' * 
  • document.pdf に改名 MyPrefix_document.pdf

削除

また、不要な文字列を削除することもできます。likeという名前の20個のMP3ファイルがCD RIP 01 Song.mp3あり、「CD RIP」部分を削除し、1つのコマンドでそれらすべてを削除したいとします。

rename 's/^CD RIP //' *
  • CD RIP 01 Song.mp301 Song.mp3

の余分なスペースに注意してください。スペースが'^CD RIP 'ないと、すべてのファイルにはファイルの最初の文字としてスペースがあります。また、これは^文字なしCD RIP でも機能しますが、ファイル名のどの部分でも一致します。^彼らは、ファイルの先頭にある場合の保証はそれが唯一の文字を削除します。

サフィックス

追加

rename 's/$/_MySuffix/' *
  • document.pdf に改名 document.pdf_MySuffix

変更

rename 's/\.pdf$/.doc/' *

変更されますSomething.pdfSomething.doc。(バックスラッシュがある理由は、.その正規表現ではワイルドカード文字です.pdfマッチがqPDF一方\.pdfだけ正確な文字列に一致する.pdf。また、非常に重要な注意することは、あなたがBASHに精通していない場合、あなたはあなたが引用符を省略しないかもしれない!単一引用符にバックスラッシュを置く必要がありますまたは、二重引用符を使用するか、bashはそれらを翻訳しようとします。bash \. "\." equalsには.(ただし、二重引用符とバックスラッシュが使用されます。たとえば、改行には「\ n」が使用されますが"\."、有効なバックエスケープシーケンスではないため、に変換されます.

実際、文字列の一部を全体ではなく引用符で囲むこともできます。これ's/Search/Replace/g's/'Search'/'Replace'/gand s/Search/Replace/gとBASH と同じです。特殊文字(およびスペース)に注意する必要があります。


-n正しい正規表現を持っていることに自信がない場合は、このオプションを使用することをお勧めします。名前が変更されることを示してから、名前を変更せずに終了します。例えば:

rename -n s/'One'/'Two'/g *

これにより、-nフラグを設定しなかった場合に行われたすべての変更がリストされます。見栄えがよければ、を押しUpて前に戻り、を消去して-nを押しますEnter(または置き換えて、-v変更をすべて出力します)。

:17.04より上のUbuntuバージョンはrenameデフォルトでは付属していませんが、まだリポジトリで利用可能です。使用sudo apt install renameしてインストールする


「動的な」接尾辞はどのように付けますか。001-010などが可能ですか?
ジウメング

うーん。私は何かを書き込もうとしましたが、うまくいきませんでした。ほとんどの場合、001に1を追加すると、002ではなく2に追加されます。それ以外の場合は、変数を使用して番号の位置を保持し、それを追加できます。また、renameコマンドについて知る前に、これを思い出しました。これは、私が追記するために行ったことです。– for f in *; do mv -v "$f" "prependThis$f"; done
マット

2
@jiewmengはい。(?:\.[0-9]{3})$パターンで使用すると、パッシブグループ内の3桁のファイル拡張子すべてに一致します。例:rename s/^my_favorite_movie.avi(?:\.[0-9]{3})$/random_movie.avi/ *。この正規表現のチートシートをご覧ください。
sergio91pt

@ sergio91ptそれは素晴らしい正規表現チートシートです。しかし、それは何についてですか?perlである必要があります-しかし、そこにそのようなメモを見つけることができません。
アドビ

@Adobe「perlベースの正規表現」の一般的なもの。+記号に関する注意とPOSIX文字クラスに関する列をご覧ください。
-sergio91pt

21

pyrenamerを試してください。

nautilusと統合されていませんが、仕事は完了します。ここにレビューがあります。

Thunar(XFCEの一部)には、個別に実行できる名前変更機能もあります。

Thunar一括名前変更


2
Thunar機能について言及してくれてありがとう。Thunarがある場合-フォルダー内のファイルを選択し、F2を押します。
最大

9

nautilus-renamerと呼ばれるランチパッド上のプロジェクトがあるようです。make installスクリプトをダウンロードして展開すると、実行してインストールできます。それはいくつかの機能を持っているようですが、もしあなたが何らかのプログラミングがあるかもしれないことを知っているなら、それはただのpythonスクリプトであるのであなたはあなたのニーズにそれを単に強化することができます。

ここに画像の説明を入力してください


8

コマンドラインでは、単一のファイルの名前を変更するには、コマンドは単純です

mv file1.txt file2.txt

バッチで実行する場合は、おそらくスクリプトを使用して実行する必要があります。詳細を提供していただければ、おそらく私または他の誰かがあなたのためにそれを作成することができます。ただし、ファイルにデータを追加するスクリプトは次のようになります。

#!/bin/bash
for file in *
do
    # separate the file name from its extension
    if [[ $file == *.* ]]; then
      ext="${file##*.}"
      fname="${file%.*}"
      mv "$file" "${fname}_APPENDSTUFFHERE.$ext"
    else
      mv "$file" "${file}_APPENDSTUFFHERE"
    fi
done

名前を変更する必要がある方法に応じて、たとえば、従う特定の名前変更ルールがある場合、これはおそらく調整されます。(私のbash-fooはそれほど素晴らしいものではないので、個人的にはPerlスクリプトを介してこれを行いますが、それは私だけです。)

以前に尋ねられた質問からファイル名と拡張子が分離されていることに注意してください。


7

コマンドラインを使用せずにWindowsで実行した場合と同様に、Tabキーではなく右矢印キーを使用します。これにより、Windowsのタブと同じように次のファイルが選択されます。


同じではありません。名前の変更を完了するにはENTER、次のファイルに移動するには矢印キー、名前を変更するにはF2が必要です。ファイルの名前を変更すると、TABは1ステップでそれを行います。
メストレリオン

@MestreLionしかし、質問で説明されているアルゴリズムに非常に似ており、追加のソフトウェアもコマンドライン操作も必要ありません。ある種のユーザーフレンドリー。
ラファウチエラク

確かに、少なくとも元の質問と同じアプローチを試みた答えはあなただけでした。そして悲しい真実は、ノーチラスにはそのような機能がないということです。F2で名前を変更できますが、それだけです。既に名前変更モードで次のファイルに自動的にジャンプするTABはありません。
メストレリオン

7

一度に多くのファイルの名前を変更するにどうすればよいのか、実際には同じ質問ではありませんしかし、その答えで提案したのと同じプログラムqmvを提案します。

qmvはrenameutilsパッケージの便利なツールです。お気に入りのテキストエディタを使用してファイルの名前を変更できます。vimのパワーと組み合わせて、優れた名前変更ユーティリティを使用できます。

私は通常qmv -f do、たくさんのファイルの名前を変更したいディレクトリのようにそれを呼び出します。または、再帰的に名前を変更する場合qmv -R -f do

複数のファイルの名前を変更する必要があるときはいつでも、常にqmv(およびvim)を使用します。

http://www.nongnu.org/renameutils/


あなたの提案に基づいてこれを試しました。vimを使用する場合、これは本当に最も素晴らしいツールです!
ste_kwr

3

唯一の適切なオプションがファイルの名前を手動で変更することである場合、それを行う素晴らしい方法はvidirmoreutilsパッケージ内で)使用することです:

sudo add-apt-repository universe && sudo apt-get update && sudo apt-get install moreutils
DESCRIPTION
       vidir allows editing of the contents of a directory in a text editor.
       If no directory is specified, the current directory is edited.

       When editing a directory, each item in the directory will appear on
       its own numbered line. These numbers are how vidir keeps track of what
       items are changed. Delete lines to remove files from the directory, or
       edit filenames to rename files. You can also switch pairs of numbers
       to swap filenames.

       Note that if "-" is specified as the directory to edit, it reads a
       list of filenames from stdin and displays those for editing.
       Alternatively, a list of files can be specified on the command line.


ファイルの選択的な名前変更

現在の作業ディレクトリのコンテンツ:

.
├── bar
├── baz
└── foo

を実行しvidir、名前を変更するファイル名を含む行のファイル名を変更します。ヒットCTRL+ OCTRL+ X

スクリーンショット3

.
├── bar.bak
├── baz.old
└── foo.new

ファイル名を選択的に切り替える

現在の作業ディレクトリのコンテンツ:

.
├── bar
├── baz
└── foo

現在の作業ディレクトリのファイルのコンテンツ:

$ for f in *; do printf '- %s:\n\n' "$f"; cat "$f"; echo; done
- bar:

This is bar

- baz:

This is baz

- foo:

This is foo

$ 

を実行しvidir、切り替えたいファイル名を含む行の数字を切り替えます。ヒットCTRL+ OCTRL+ X

スクリーンショット4

.
├── bar
├── baz
└── foo
$ for f in *; do printf '- %s:\n\n' "$f"; cat "$f"; echo; done
- bar:

This is foo

- baz:

This is bar

- foo:

This is baz

$ 

ファイルを選択的に削除する

現在の作業ディレクトリのコンテンツ:

.
├── bar
├── baz
└── foo

を実行しvidir、削除するファイルを含む行を削除します。ヒットCTRL+ OCTRL+ X

スクリーンショット2

.
└── baz

2

私はkrenameを使用しています。GUIアプリです。mp3タグなどを読み取ることができます。

Krusaderの一部としてだけでなく、個別のアプリとしても存在します。

renameスクリプトもあります-これは標準のperlインストールの一部です(おそらくインストールされています)。で確認してくださいman rename

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.