在没有perl的* nix上 rename
可得到
在某些* nix上没有可用的重命名,所以有必要这样做
使用其他方法重命名。几年前我建议 zmv
虽然很棒,但也不一定可用。
使用builtins和sed,我们可以快速启动一个shell脚本
这给了我们与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
原样
在这里,但这是一个相当小的变化,所以我觉得它很好
包括它。
我们需要一个效用函数, 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兼容正则表达式)。你可以有sed
扩展正则表达式语法,使用任何一种 sed -r
要么 sed -E
取决于您的平台。
请参阅POSIX兼容 man re_format
有关的完整描述
sed基本和扩展的正则表达式模式。