清理文件名的简单脚本

时间:2013-10-12 10:19:38

标签: regex linux bash filenames

我有以下“问题”。我有一堆名为“ThisIsAFile-BLAH.txt”的文件(如数千个),我想清理这些文件名,以便它们只被称为“ThisIsAFile.txt”,删除“ - ”符号后的所有内容它

最好的方法是什么?

提前感谢您的时间和帮助。

P.S。 操作系统是GNU / Linux。 附: 2 我正在尝试通过编写简单的脚本来教自己如何自动执行琐碎的任务。

解决方案:

谢谢你们。我终于明白了。

rename 's/-[^-]*(?=\.\w+)$//' *.txt

再次感谢。

4 个答案:

答案 0 :(得分:1)

检查man rename,看看是否支持正则表达式。如果是这样的话,就像这样简单的事情

rename 's/-.*/.txt/' *.txt

搜索短划线的所有.txt文件名,并用.txt

替换它和后面的所有内容。

答案 1 :(得分:1)

让我们说:

s="ThisIsAFile-BLAH.txt"

Pure BASH:

echo "${s/-*\./.}"
ThisIsAFile.txt

使用sed:

sed 's/-.*\./\./' <<< "$s"
ThisIsAFile.txt

答案 2 :(得分:0)

使用awk可以写成

输入文件:

ThisIsAFile2-Blah.txt
ThisIsAFile3-Blah.txt
ThisIsAFile-Blah.txt

更改命令

ls *.txt|awk `s=$1` 'BEGIN{FS="-"; OFS=""} {print "mv "$s" "$1,".txt"}' |sh

输出相同的是

 ThisIsAFile2.txt
 ThisIsAFile3.txt
 ThisIsAFile.txt

答案 3 :(得分:0)

如果没有太多文件,可以使用glob:

循环遍历文件
for i in *-BLAH.txt; do
    mv -nv -- "$i" "${i%-BLAH.txt}.txt"
done

(注意使用-n以便不覆盖已存在的文件,使用-v使得详细(可选)和使用--只是如果一个文件以连字符开头,以免混淆试图将其解释为选项的mv。也不是报价!

如果您有很多文件,可以使用find,它可能比Bash的全局更快:

find . -maxdepth 1 -name '*-BLAH.txt' -exec bash -c 'while(($#)); do mv -nv -- "$1" "${1%-BLAH.txt}"; shift; done' _ {} +

这里我使用的是 find +运算符,因此bash命令不会产生太多次。然后 bash find 给出的参数进行循环。注意使用虚拟参数_,因为以这种方式启动, Bash 将设置其位置参数从0开始,而不是从1开始。

find 方法非常好,因为您可以微调哪些文件将应用 bash 循环。在 bash 循环中,您可以生成您喜欢的任何重命名方案。