我有许多文件,其中包含以下命名:
name1.name2.s01.ep01.RANDOMWORD.mp4
name1.name2.s01.ep02.RANDOMWORD.mp4
name1.name2.s01.ep03.RANDOMWORD.mp4
我需要删除最后一个之间的所有内容。和文件名中的ep#只有name1.name2.s01.ep01.mp4
(有时扩展名可能不同)
name1.name2.s01.ep01.mp4
name1.name2.s01.ep02.mp4
name1.name2.s01.ep03.mp4
答案 0 :(得分:4)
for file in /path/to/base_folder/* #Globbing to get the files
do
epno=${file#*.ep}
mv "$file" "${file%.ep*}."ep${epno%%.*}".${file##*.}"
#For the renaming part,see the note below
done
注意:还没有抓住shell参数扩展吗?检查[ this ]。
答案 1 :(得分:1)
使用Linux字符串操作(参考:http://www.tldp.org/LDP/abs/html/string-manipulation.html),你可以这样做:
您需要按文件扩展名类型执行。
for file in <directory>/*
do
name=${file}
firstchar="${name:0:1}"
extension=${name##${firstchar}*.}
lastchar=$(echo ${name} | tail -c 2)
strip1=${name%.*$lastchar}
lastchar=$(echo ${strip1} | tail -c 2)
strip2=${strip1%.*$lastchar}
mv $name "${strip2}.${extension}"
done
答案 2 :(得分:0)
您可以使用rename
(您可能需要安装它)。但它在文件名上的作用类似于sed
。
作为一个例子
$ for i in `seq 3`; do touch "name1.name2.s01.ep0$i.RANDOMWORD.txt"; done
$ ls -l
name1.name2.s01.ep01.RANDOMWORD.txt
name1.name2.s01.ep02.RANDOMWORD.txt
name1.name2.s01.ep03.RANDOMWORD.txt
$ rename 's/(name1.name2.s01.ep\d{2})\..*(.txt)$/$1$2/' name1.name2.s01.ep0*
$ ls -l
name1.name2.s01.ep01.txt
name1.name2.s01.ep02.txt
name1.name2.s01.ep03.txt
此表达式与您的文件名匹配,并使用两个捕获组,以便替换操作中的$1$2
是&#34; RANDOMWORD&#34;之外的部分。
(name1.name2.s01.ep\d{2})\..*(.txt)$