使用公共分隔符删除部分文件名

时间:2018-01-10 02:33:25

标签: linux bash rename

我有许多文件,其中包含以下命名:

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

3 个答案:

答案 0 :(得分:4)

这是@Jesse [answer]

的更简单版本
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)$