我想使用bash重命名一堆文件,转换此文件模式:
prefix - name - suffix.txt
进入这一个:
name.txt
为此,我编写了以下脚本:
find . -name "*.txt" | while read f
do
mv "${f}" "${f/prefix - /}"
done
find . -name "*.txt" | while read f
do
mv "${f}" "${f/ - suffix/}"
done
它可以工作,但我想使用单个循环执行重命名。有可能吗?
答案 0 :(得分:8)
另一种方法,为了好玩,使用正则表达式:
regex='prefix - (.*) - suffix.txt'
for f in *.txt; do
[[ $f =~ $regex ]] && mv "$f" "${BASH_REMATCH[1]}.txt"
done
实际上,在这里使用简单模式'* .txt'有两个问题:
使用find
使过程变得复杂,但更正确:
find . -maxdepth 1 -regex 'prefix - .* - suffix.txt' -print0 | \
while read -d '' -r; do
[[ $REPLY =~ $regex ]] && mv "$REPLY" "${BASH_REMATCH[1]}.txt"
done
答案 1 :(得分:3)
如果您可以访问GNU sed
,则可以使用某些正则表达式执行以下操作:
for i in *.txt; do mv "$i" "$(echo $i | sed -r 's/([^-]*)\s-\s(.*)\s-\s([^-]*)\.txt/\2.txt/')"; done
答案 2 :(得分:0)
你可以用这个:
find . -name "*.txt" -print0 | awk -v RS="\0" -v ORS="\0" '{print $0;sub(/^prefix - /,""); sub(/ - suffix.txt$/,".txt"); print $0; }' | xargs -0 -n 2 mv
可以更清楚地写成:
find . -name "*.txt" -print0 |
awk -v RS="\0" -v ORS="\0" '{
print $0;
sub(/^prefix - /,"");
sub(/ - suffix.txt$/,".txt");
print $0;
}' |
xargs -0 -n 2 mv
答案 3 :(得分:0)
如果您安装了emacs
。您可以使用dired
功能。
bash
:# open your dir with emacs
emacs /path/to/your/dir
emacs
:\.txt$
输入标记所有txt
个文件。.*- \(.*\) -.*
输入 \1.txt
输入重命名。