一括リネーム、* nixバージョン


11

私は* nix(UbuntuとFreeBSD、別々に)を使用していることを除いて、これ同じように(Windows関連の質問)非常に多くの同じような名前のファイルの名前を変更する方法を探していました。要約すると、シェル(Bash、CSHなど)を使用しながら、たとえば次のファイルのように、いくつかのファイルの名前を一括変更するにはどうすればよいですか。

ベートーベン-毛皮Elise.mp3
ベートーベン-月光のソナタ.mp3
ベートーベン-喜びへのオード.mp3
ベートーベン-失われたペニーの怒り.mp3

これらのように名前が変更されますか?

ファー・エリーゼ.mp3
Moonlight Sonata.mp3
Ode to Joy.mp3
レイジ・オーバー・ザ・ロスト・ペニー.mp3

これを行う理由は、これらのファイルのコレクションが「Beethoven」という名前のディレクトリ(つまり、ファイル名のプレフィックス)の下に配置され、ファイル名自体にこの情報があることは冗長だからです。

回答:


12

名前変更ユーティリティはあなたが望むことをします。

使うだけ rename 's/Beethoven\ -\ //g' *.mp3


編集してユーティリティへのリンクを提供してもらえますか、それとも言及されている両方のディストリビューション(UbuntuとFreeBSD)の標準ですか?
クリスW.レア

1
Perlが付属しています。Debianはこれを名前変更コマンドとして使用しているため、Ubuntuも使用していると思われます。価値のない別の 'rename'コマンドがあるので、manページを確認してください。
derobert 09

うわー、名前の変更構文はvimの置換に非常に似ています:D
Dzung Nguyen

/ usr / portsディレクトリ/のsysutils /名前変更のポートは、FreeBSDの中で完全に働いた
ジョシュ・W.

10

Linux / Unixでの多くのことのように、それを行う方法は複数あります!

一部のユーザーはmmv(mass mv)を使用する場合があります。

一部のPerlパッケージ(新しいUbuntuおよびDebian)に付属のrenameコマンドまたはprenameコマンドもこれを実行できます。

prename 's/Beethoven\ -\ //g' Beethoven*.mp3

Fedora 10の名前変更ツールはこれと同じプログラムではなく、動作が異なることに注意してください。これは別のパッケージutil-linux-ngの一部であり、ここで見つけることができます

私はしばしば、癖のあるループのシェルに行くだけです(そのようなツールがすべて存在するとは限らなかったためです)。

mkdir -p Beethoven
for x in Beethoven\ -\ *
do
mv "$x" Beethoven/"${x/Beethoven - /}"
done

これにより、Beethovenディレクトリが作成され、ファイルがそのディレクトリ/ファイル名に移動されます。ファイル名の「Beethoven-」は何も置き換えられません。

テストとして、前に:

$ ls
Beethoven - Fur Elise.mp3                 Beethoven - Ode to Joy.mp3
Beethoven - Moonlight Sonata.mp3          Beethoven - Rage Over the Lost Penny.mp3

後:

$ ls Beethoven/
Fur Elise.mp3                 Ode to Joy.mp3
Moonlight Sonata.mp3          Rage Over the Lost Penny.mp3

4

grepとrenameの組み合わせを使用して実装されたこのソリューションを試してください。これは、名前を変更する必要があるディレクトリがたくさんあると想定しています。少数しかない場合は、手動でアプローチし、それぞれに「Artist-」パターンをハードコーディングします。

# Rename any mp3 files in the directory hierarchy of type "a - b.mp3" to "b.mp3"
find . -name "*.mp3" -exec rename -n -v 's|^(.*/).*-\s*(.*)\s*$|$1$2|g' {} \;

説明発見は 検索のコマンドが持つすべてのファイルを検索します.MP3の現在のファイル階層内の拡張、およびに渡される引数を呼び出します-execそれぞれに。-exec内では、{}find(file path + name)によって渡された引数を参照することに注意してください。確実にするために渡される名前を変更し、代わりのの終わりを示すのfindコマンドを使用します。
\;;

上記のコマンドには-n(アクションなし)スイッチがあります。したがって、それを実行した場合に何が起こるかだけがわかります。このコマンドを-nスイッチなしで実行することをお勧めします。一度実行した後、提案された結果に満足している場合のみ。

正規表現について。

  • ^ 文字列の先頭に一致します。
  • $ 文字列の末尾に一致します。
  • . 任意の文字に一致します。
  • *は、先行する構造のゼロ以上を意味します。たとえば.*、0個以上の文字を意味します。
  • \s スペース文字を表します。
  • \S スペース以外の文字を表します。
  • 内の()すべてのものがキャプチャされ$1$2その位置に応じて、、として反映されます。

正規表現:

  • 最初にオプションのディレクトリ構造を探し、$ 1でこれをキャプチャします。 (.*/)
  • -」まですべてをスキップします。.*-
  • 先頭と末尾のスペースを除く残りの文字列を$ 2でキャプチャします。 (.*)
  • ファイルを$ 1 $ 2に書き換えます。これは「/path/to/file/」「filename.mp3」である必要があります

これが私のテスト実行です。

/tmp/test$ ls -R
.:
a  b  c  z-unknown.mp3

./a:
a3.mp3                 a - longer title3.mp3  c.mp3   disc2
a - longer title2.mp3  a - long title.mp3     disc 1  the band - the title.mp3

./a/disc 1:
a - title1.mp3  a - title2.mp3

./a/disc2:
a - title1.mp3  a - title2.mp3

./b:
cd - ab - title3.mp3  cd - title1.mp3  cd - title2.mp3  c.mp3

./c:
c-pony2.mp4  c - pony3.mp3  c - pony4.mp3  c-pony.mp3

/tmp/test$ find . -name "*.mp3" -exec rename -v 's|^(.*/).*-\s*(.*)\s*$|$1$2|g' {} \;
./c/c-pony.mp3 renamed as ./c/pony.mp3
./c/c - pony4.mp3 renamed as ./c/pony4.mp3
./c/c - pony3.mp3 renamed as ./c/pony3.mp3
./z-unknown.mp3 renamed as ./unknown.mp3
./a/the band - the title.mp3 renamed as ./a/the title.mp3
./a/a - longer title2.mp3 renamed as ./a/longer title2.mp3
./a/a - longer title3.mp3 renamed as ./a/longer title3.mp3
./a/disc 1/a - title1.mp3 renamed as ./a/disc 1/title1.mp3
./a/disc 1/a - title2.mp3 renamed as ./a/disc 1/title2.mp3
./a/a - long title.mp3 renamed as ./a/long title.mp3
./a/disc2/a - title1.mp3 renamed as ./a/disc2/title1.mp3
./a/disc2/a - title2.mp3 renamed as ./a/disc2/title2.mp3
./b/cd - title1.mp3 renamed as ./b/title1.mp3
./b/cd - title2.mp3 renamed as ./b/title2.mp3
./b/cd - ab - title3.mp3 renamed as ./b/title3.mp3

/tmp/test$ ls -R
.:
a  b  c  unknown.mp3

./a:
a3.mp3  c.mp3  disc 1  disc2  longer title2.mp3  longer title3.mp3  long title.mp3  the title.mp3

./a/disc 1:
title1.mp3  title2.mp3

./a/disc2:
title1.mp3  title2.mp3

./b:
c.mp3  title1.mp3  title2.mp3  title3.mp3

./c:
c-pony2.mp4  pony3.mp3  pony4.mp3  pony.mp3

正規表現は扱いにくいビジネスであり、私はそれらを書くのに多くの失敗をしたので、この1つのメリットの欠如に関するどんな入力も歓迎します。私はこれをテストするかなりの数を見つけたことを知っています。


1

特にスクリプト作成のために、ファイル(およびディレクトリ)の名前変更を簡単にするコマンドラインJavaプログラムを作成しました。それは無料でオープンソースなので、あなたの心のコンテンツにそれを変更することができます:

RenameWand
http://renamewand.sourceforge.net/

関連する使用例:

フォームのファイルを"<a> - <b>"それぞれのディレクトリに移動します"<a>"

java -jar RenameWand.jar  "<a> - <b>"  "<a>/<b>"

ファイルを最終更新時刻で並べ替え、3桁の番号に変更します。

java -jar RenameWand.jar  "<a>"  "<3|#FT> <a>"

ファイル名の一部を再配置し、大文字と小文字を変更します。

java -jar RenameWand.jar  "<album> - <artist> - <song>.<ext>" 
                          "<artist.upper> <album.title> - <song>.<ext.lower>"

1

zmv zshの名前変更ツールは非常に優れています。

# zmv "programmable rename"
# Replace spaces in filenames with a underline
zmv '* *' '$f:gs/ /_'
# Change the suffix from *.sh to *.pl
zmv -W '*.sh' '*.pl'
# lowercase/uppercase all files/directories
$ zmv '(*)' '${(L)1}' # lowercase
$ zmv '(*)' '${(U)1}' # uppercase

その他のメモはこちら...


0

ペンギンの頭の場合、これはシェルスクリプトまたはAWKスクリプトで簡単に実行できます。私たちの単なる人間にとっては、真夜中の司令官を試してみてください。ほとんどのLinuxディストリビューションで、シェルプロンプトからmc -aと入力します。正規表現を使用してファイルの名前を変更できます。私はGeekStuff http://www.thegeekstuff.com/2009/06/how-to-rename-files-in-group/の記事を参考にしてくれました。


0

以下は簡単なコマンドラインの例です。たくさんのpngファイルの名前の途中に「白」という言葉がありました。それを取り出して、アンダースコアを1つだけ残したかったのです。これはトリックをしました:

for i in *.png; do mv "$i" "${i/white/}"; done

0

使用vidir、その後、あなたのエディタがリネームパターンを適用するために使用しています。

名前

vidir-ディレクトリを編集する

あらすじ

vidir [--verbose] [ディレクトリ|ファイル|-] ...

説明

vidirでは、テキストエディターでディレクトリの内容を編集できます。ディレクトリが指定されていない場合、現在のディレクトリが編集されます。

ディレクトリを編集する場合、ディレクトリ内の各項目は、独自の番号付きの行に表示されます。これらの数値は、変更されたアイテムをvidirが追跡する方法です。行を削除してディレクトリからファイルを削除するか、ファイル名を編集してファイルの名前を変更します。数字のペアを切り替えて、ファイル名を入れ替えることもできます。

編集するディレクトリとして「-」が指定されている場合は、stdinからファイル名のリストを読み取り、それらを編集用に表示することに注意してください。または、コマンドラインでファイルのリストを指定できます。

vidir vidir * .jpeg典型的な使用法。

見つける| vidir-サブディレクトリの内容も編集します。サブディレクトリを削除するには、エディターですべてのコンテンツとサブディレクトリ自体を削除します。

find -type f | vidir-現在のディレクトリとサブディレクトリの下にあるすべてのファイルを編集します。

著者

ジョーイ・ヘス2006-2010

Magnus Woldrich 2011による修正

著作権

Copyright 2006-2011上記のvidir「AUTHOR」。

GNU GPLの下でライセンスされています。


0

perlがrename利用できない* nixで

一部の* nixでは、名前の変更が利用できないため、他の方法を使用して名前を変更する必要があります。数年前、私はzmvここで提案しましたが、それはすばらしいものの、必ずしも利用できるとは限りません。

ビルトインとsedを使用して、シェルスクリプトをすばやく作成して、perl renameスクリプトと非常によく似た構文を提供します。

sedrename() {
  if [ $# -gt 1 ]; then
    sed_pattern=$1
    shift
    for file in $(ls $@); do
      mv -v "$file" "$(sed $sed_pattern <<< $file)"
    done
  else
    echo "usage: $0 sed_pattern files..."
  fi
}

使用法

sedrename 's/Beethoven\ -\ //g' *.mp3

before:

./Beethoven - Fur Elise.mp3
./Beethoven - Moonlight Sonata.mp3
./Beethoven - Ode to Joy.mp3
./Beethoven - Rage Over the Lost Penny.mp3

after:

./Fur Elise.mp3
./Moonlight Sonata.mp3
./Ode to Joy.mp3
./Rage Over the Lost Penny.mp3

ターゲットフォルダも作成したいとします...

以来は、mv私たちが使用していないことができ、フォルダを作成しませんsedrename、それはここにあるように、私はあまりにもそれを含めるのはいいことだ把握して、それは、かなり小さな変更です。

abspath新しいフォルダー構造を含むsed / renameパターンのターゲットフォルダーを生成できるように、ユーティリティ関数(または絶対パス)が必要です。

abspath () { case "$1" in
               /*)printf "%s\n" "$1";;
               *)printf "%s\n" "$PWD/$1";;
             esac; }

これにより、ターゲットフォルダの名前が確実にわかります。名前を変更するときは、ターゲットファイル名で使用する必要があります。

# generate the rename target
target="$(sed $sed_pattern <<< $file)"

# Use absolute path of the rename target to make target folder structure
mkdir -p "$(dirname $(abspath $target))"

# finally move the file to the target name/folders
mv -v "$file" "$target"

完全なフォルダ対応スクリプトは次のとおりです...

sedrename() {
  if [ $# -gt 1 ]; then
    sed_pattern=$1
    shift
    for file in $(ls $@); do
      target="$(sed $sed_pattern <<< $file)"
      mkdir -p "$(dirname $(abspath $target))"
      mv -v "$file" "$target"
    done
  else
    echo "usage: $0 sed_pattern files..."
  fi
}

もちろん、特定のターゲットフォルダーがない場合でも機能します。

すべての曲をフォルダーに入れたい場合、./Beethoven/これを行うことができます。

使用法

sedrename 's|Beethoven - |Beethoven/|g' *.mp3

before:

./Beethoven - Fur Elise.mp3
./Beethoven - Moonlight Sonata.mp3
./Beethoven - Ode to Joy.mp3
./Beethoven - Rage Over the Lost Penny.mp3

after:

./Beethoven/Fur Elise.mp3
./Beethoven/Moonlight Sonata.mp3
./Beethoven/Ode to Joy.mp3
./Beethoven/Rage Over the Lost Penny.mp3

ボーナスラウンド...

このスクリプトを使用して、フォルダーから単一のフォルダーにファイルを移動します。

一致するすべてのファイルを収集し、それらを現在のフォルダーに配置する場合は、次のようにします。

sedrename 's|.*/||' **/*.mp3

before:

./Beethoven/Fur Elise.mp3
./Beethoven/Moonlight Sonata.mp3
./Beethoven/Ode to Joy.mp3
./Beethoven/Rage Over the Lost Penny.mp3

after:

./Beethoven/ # (now empty)
./Fur Elise.mp3
./Moonlight Sonata.mp3
./Ode to Joy.mp3
./Rage Over the Lost Penny.mp3

sed正規表現パターンに関する注意

このスクリプトでは通常のsedパターンルールが適用されますが、これらのパターンはPCRE(Perl Compatible Regular Expressions)ではありません。 プラットフォームのいずれsed -rかを使用して、またはsed -Eプラットフォームに応じて、拡張正規表現構文をsedできます。

man re_formatsedの基本および拡張正規表現パターンの完全な説明については、POSIX準拠を参照してください。

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