通过省略最后 3 个字符重命名目录中的所有文件

Rename all files in a directory by omitting last 3 characters

我正在尝试编写一个 bash 命令,该命令将通过省略最后 3 个字符来重命名当前目录中的所有文件。我不确定这是否可能就是我在这里问的原因。

我有很多这样命名的文件:720-1458907789605.ts

我需要通过省略最后 3 个字符来重命名所有文件,以便从 720-1458907789605.ts ---> 720-1458907789.ts 获取当前目录中的所有文件。

是否可以使用 bash 命令?我是 bash 脚本的新手。

谢谢!

随着 Larry Wall 的重命名:

rename -n 's/...\.ts$/.ts/' *.ts

如果一切正常,请删除干燥 运行 选项 -n

原生bash解决方案:

for f in *.ts; do
    [[ -f "$f" ]] || continue # if you do not need to rename directories
    mv "$f" "${f:: -6}.ts"
done

如果你有很多文件,这个解决方案会很慢:for 中的 star-expansion 会占用内存和时间。

参考:bash substring extraction.

如果你有一个非常大的数据集,更复杂但更快的解决方案是:

find . -type f -name '*.ts' -depth 1 -print0 | while read -d $[=11=] f; do
    mv "$f" "${f%???.ts}.ts"
done