【问题标题】:Remove part of filename with common delimiter使用通用分隔符删除部分文件名
【发布时间】:2018-06-19 03:41:40
【问题描述】:

我有许多文件的命名如下:

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

【问题讨论】:

  • 顺便说一句,filebot.net
  • 我现在删除我的答案,因为我真的不明白这个问题......
  • @FrankAK 很明显应该从文件名中删除RANDOMWORD...
  • 请用您迄今为止为实现您的ob所做的工作更新问题。
  • fName=name1.name2.s01.ep03.RANDOMWORD.mp4 ; fName=${fName%.mp4} ; fName=${fName%.*}.mp4; echo New fName=${fName} 祝你好运。

标签: linux bash rename


【解决方案1】:

这是@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 ]

【讨论】:

  • 对不起,它确实有效!您能否扩展答案以删除多个 RANDOMWORD。它删除了所有单个实例,但如果有多个实例,它保持不变。例如dance.hall.s01ep01.tom.is.on.fire.mp4。在此示例中,需要删除 .tom.is.on.fire
  • 投反对票的请告诉我为什么投反对票?嗯?
  • 对于多个随机词,这种方法是行不通的。您需要一个更细粒度的文本处理工具。
  • 我很抱歉,我过早地这样做了,但我可以在修改答案后投票。如果答案未修改,stackoverflow 将不允许我现在投票。
  • @Andy 哦!没关系,伙计!没有问题。 :-) 但是再问一个问题,看看我是否可以提供任何帮助.. 多个随机单词之前的单词是否遵循某种模式?
【解决方案2】:

使用 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

【讨论】:

  • 但是,我觉得这可以变得更简单;-)
  • 绝对是。这是一个问题,是否值得花时间/精力来做到这一点
  • 嗯。我同意。您也可以将Linux String manipulation functions 更改为Linux Shell Parameter Expansion。前者有点混乱。
【解决方案3】:

您可以使用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 是“RANDOMWORD”之外的部分

(name1.name2.s01.ep\d{2})\..*(.txt)$

【讨论】:

    猜你喜欢
    • 2023-04-01
    • 1970-01-01
    • 2017-04-08
    • 2020-02-11
    • 2012-01-11
    • 1970-01-01
    • 2017-04-01
    • 1970-01-01
    • 2022-11-17
    相关资源
    最近更新 更多