通过省略最后 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 会占用内存和时间。
如果你有一个非常大的数据集,更复杂但更快的解决方案是:
find . -type f -name '*.ts' -depth 1 -print0 | while read -d $[=11=] f; do
mv "$f" "${f%???.ts}.ts"
done
我正在尝试编写一个 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 会占用内存和时间。
如果你有一个非常大的数据集,更复杂但更快的解决方案是:
find . -type f -name '*.ts' -depth 1 -print0 | while read -d $[=11=] f; do
mv "$f" "${f%???.ts}.ts"
done