膨大な数の同じ名前のファイルの名前を変更する方法を探していました これとよく似ています(Windows関連の質問) * nix(UbuntuとFreeBSD、別々に)を使用していることを除いて。要約すると、シェル(Bash、CSHなど)を使用しているときに、次のファイルなど、いくつかのファイルの名前を一括変更するにはどうすればよいですか。
ベートーベン-ファーエリーゼ.mp3
ベートーベン-月光ソナタ.mp3
ベートーベン-Joy.mp3へのオード
ベートーベン-失われた小銭への怒り.mp3
このように名前が変更されますか?
エリーゼのために.mp3
月光ソナタ.mp3
Joy.mp3へのオード
失われた小銭への怒り.mp3
これを実行したい理由は、これらのファイルのコレクションが「ベートーベン」という名前のディレクトリ(つまり、ファイル名のプレフィックス)の下に配置され、ファイル名自体にこの情報を含めることは冗長になるためです。
名前変更ユーティリティはあなたが望むことをします。
rename 's/Beethoven\ -\ //g' *.mp3
を使用するだけです
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
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
として反映されます。正規表現:
(.*/)
-
」まですべてスキップします:.*-
(.*)
これが私のテストランです:
/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
正規表現はトリッキーなビジネスであり、私はそれらを書くのに多くの失敗をしたので、これのメリットの欠如についての意見を歓迎します。私はこれをテストしているかなりの数を見つけたことを知っています。
特にスクリプトの場合、ファイル(およびディレクトリ)の名前を簡単に変更できるコマンドライン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>"
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
ペンギンの頭の場合、これはシェルスクリプトまたはAWKスクリプトで簡単に実行できます。私たちにとって、あなたは真夜中の司令官を試してみたいと思うかもしれません。シェルプロンプトタイプmc-aからのほとんどのLinuxディストリビューションにあります。正規表現を使用してファイルの名前を変更できます。 GeekStuffの記事を使用しました http://www.thegeekstuff.com/2009/06/how-to-rename-files-in-group/ 私を助けてくれました。
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パターンルールが適用されます。これらのパターンはPCRE(Perl互換の正規表現)ではありません。プラットフォームに応じて、sed -r
またはsed -E
のいずれかを使用して、拡張正規表現構文をsedすることができます。
Sedの基本および拡張正規表現パターンの完全な説明については、POSIX準拠のman re_format
を参照してください。
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の下でライセンスされています。
これは簡単なコマンドラインの例です。たくさんのpngファイルの名前の真ん中に「白」という言葉がありました。私はそれを取り出して、アンダースコアを1つだけ残したかったのです。これはトリックをしました:
for i in *.png; do mv "$i" "${i/white/}"; done