如何从bash中的多个文件名中删除公共前缀模式

时间:2016-03-31 16:12:16

标签: bash shell unix rename wildcard-expansion

我需要重命名成千上万的文件,现在我正在删除前x个字符,但这可能是一个漫长的过程,因为需要删除的字符数会发生变化。

源文件的名称如下:

4023 - 23 - Animal, crocodile 4 legs.txt 
243 - 4 - Animal, dog 4 legs.txt 
5450 - 2 - Animal, bird 2 legs.txt

重命名:

Animal, crocodile 4 legs.txt
Animal, dog 4 legs.txt
Animal, bird 2 legs.txt

在#34; A"之前修剪一切似乎是最简单的。出现了,但我不知道该怎么做。带有可以用作bash脚本的循环的东西会很棒。

2 个答案:

答案 0 :(得分:2)

您可以使用bash parameter expansion

${VAR#*-*- }

按模式删除前缀。这是使用shell变量VAR中的文本并基于删除与通配符模式*-*-匹配的前缀生成字符串 - 例如任何字符然后是破折号然后是任何字符,然后是第二个破折号和空格

为了在循环中获取文件名,您只需使用带有模式的bash for

for VAR in *.txt; do mv "$VAR" "${VAR#*-*- }"; done

mv中引用是必要的,以防止文件名中的空格被shell拆分成多个参数

答案 1 :(得分:0)

您可以使用cut -d"-" -f3

for VAR in *-*-*.txt; do mv "$VAR" "`echo $VAR | cut -d'-' -f3 `"; done

或者,忽略第一个空格:

for VAR in *-*-*.txt; do mv "$VAR" "`echo $VAR | sed -e 's/^.*- //g'`"; done