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_format
sedの基本および拡張正規表現パターンの完全な説明については、POSIX準拠を参照してください。