web-dev-qa-db-ja.com

一括名前変更、* nixバージョン

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

ベートーベン-ファーエリーゼ.mp3
ベートーベン-月光ソナタ.mp3
ベートーベン-Joy.mp3へのオード
ベートーベン-失われた小銭への怒り.mp3

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

エリーゼのために.mp3
月光ソナタ.mp3
Joy.mp3へのオード
失われた小銭への怒り.mp3

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

11
Paolo B.

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

rename 's/Beethoven\ -\ //g' *.mp3を使用するだけです

12
user6688

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

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

テストとして、前に:

$ 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
10
jtimberman

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' {} \;

findの説明
findコマンドは、現在のファイル階層で。mp3拡張子を持つすべてのファイルを検索し、渡された引数を呼び出します-それぞれのexec-exec内で、{}findによって渡された引数を参照することに注意してください。 )(ファイルパス+名前)。 \;は、findの終わりを示す代わりに、;renameに渡されることを保証しますコマンド。

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

正規表現の場合

  • ^は文字列の先頭に一致します。
  • $は文字列の終わりに一致します。
  • .は任意の文字に一致します。
  • *は、先行する構成の0個以上を意味します。例:.*は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

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

4
user4358

特にスクリプトの場合、ファイル(およびディレクトリ)の名前を簡単に変更できるコマンドライン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
Zach Scrivena

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

# 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

ここにもっとメモがあります...

1
ocodo

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

0
TechScott

Perlのない* nixではrenameが利用可能

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

ビルトインとsedを使用すると、シェルスクリプトをすばやく作成してこれを実行できます。これにより、Perlの名前変更スクリプトと非常によく似た構文が得られますが、エラー処理の優れた機能はありませんが、作業は完了します。

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を使用することはできませんが、これはかなり小さな変更であるため、これも含めるとよいと思います。

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

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互換の正規表現)ではありません。プラットフォームに応じて、sed -rまたはsed -Eのいずれかを使用して、拡張正規表現構文をsedすることができます。

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

0
ocodo

vidir を使用してから、エディター機能を使用して名前変更パターンを適用します。

名前

vidir-ディレクトリの編集

概要

vidir [--verbose] [directory | file |-].。

説明

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

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

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

vidir vidir * .jpeg一般的な使用法。

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

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

著者

ジョーイヘス2006-2010

Magnus Woldrich2011による変更

著作権

Copyright2006-2011上記のvidir「AUTHOR」。

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

0

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

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