1

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

最好的方法是什么?

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

PS 操作系统是 GNU/Linux。PS 2 我正在尝试通过编写简单的脚本来教自己如何自动化琐碎的任务。

解决方案:

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

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

再次感谢。

4

4 回答 4

1

检查man rename,看看是否支持正则表达式。如果是这样,那么简单的事情就可以了

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

这会在所有 .txt 文件名中搜索破折号,并将其替换为 .txt 后面的所有内容

于 2013-10-12T10:23:10.430 回答
1

比方说:

s="ThisIsAFile-BLAH.txt"

纯 BASH:

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

使用 sed:

sed 's/-.*\./\./' <<< "$s"
ThisIsAFile.txt
于 2013-10-12T10:24:13.183 回答
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
于 2013-10-12T12:48:06.560 回答
0

如果您没有太多文件,则可以使用 glob 遍历文件:

for i in *-BLAH.txt; do
    mv -nv -- "$i" "${i%-BLAH.txt}.txt"
done

(注意使用-nso 是为了不覆盖一个已经存在的文件,使用-vso at 是冗长的(可选的)和使用,--以防一个文件以连字符开头,以免混淆mv试图将其解释为选项)。也不是报价单!

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

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

在这里,我使用find+运算符,这样bash命令就不会产生太多次。然后bashfind给出的参数进行循环。_请注意自从以这种方式启动以来使用了 dummy 参数, Bash将从 0 开始设置其位置参数,而不是从 1 开始。

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

于 2013-10-12T13:22:50.273 回答