我们可以假设sed 在任何 *nix 上都可用,但我们不能确定
它将支持sed -n 生成 mv 命令。 (注意:只有 GNU sed 这样做。)
即便如此,bash 内置函数和 sed,我们可以快速启动一个 shell 函数来执行此操作。
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|\(.*\)\(-[0-9.]*\.pkg\)|\1\2|' *.pkg
before:
./Xft2-2.1.13.pkg
./jasper-1.900.1.pkg
./xorg-libXrandr-1.2.3.pkg
after:
./Xft2.pkg
./jasper.pkg
./xorg-libXrandr.pkg
创建目标文件夹:
由于mv 不会自动创建我们无法使用的目标文件夹
我们的初始版本sedrename。
这是一个相当小的变化,所以最好包含这个功能:
我们需要一个实用函数,abspath(或绝对路径),因为 bash
没有这个内置。
abspath () { case "$1" in
/*)printf "%s\n" "$1";;
*)printf "%s\n" "$PWD/$1";;
esac; }
一旦我们有了它,我们就可以生成目标文件夹
包含新文件夹结构的 sed/rename 模式。
这将确保我们知道目标文件夹的名称。什么时候我们
rename 我们需要在目标文件名上使用它。
# 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 基本和扩展的正则表达式模式。