如何在 linux 中批量重命名文件并在扩展后删除其他字符

How to bulk rename files and remove additional characters after extension in linux

我使用此 bash 命令下载的 txt 文件中有太多文件 urls

awk '{url=; ="";{sub(/ /,"");out=url" -O \""[=11=]"\""}; print out}' file.txt | xargs -L 1 wget

上面的 bash 命令应该获取每个文件 url 和名称,然后在下载时使用每个文件 url 前面列出的原始名称重命名它们,包含这些 url 及其各自名称的 txt 文件组织如下:

http://example.com/1425233/47188.mp4 Abaixo de Zero (2021).mp4
http://example.com/1425233/47185.mp4 A Sentinela (2021).mp4
http://example.com/1425233/46849.mp4 Eu Me Importo (2021).mp4
http://example.com/1425233/47933.mp4 Loucura de Amor (2021).mp4

干得好,到目前为止一切正常,现在的问题是,当下载完成后,当我在终端中输入 ls 命令时,每个文件都带有这样的标题,所有文件都是看起来像这样:

'Abaixo de Zero (2021).mp4'$'\r'
'A Sentinela (2021).mp4'$'\r'
'Eu Me Importo (2021).mp4'$'\r'
'Loucura de Amor (2021).mp4'$'\r'

所以这个问题导致视频不再播放,但是当我再次手动重命名为 mp4 时,'$'\r' 字符串消失并且视频能够播放...

所以说我想要一个 linux 命令可以批量重命名所有文件并删除这个 '$'\r' 字符串...

然后当在终端中列出时,文件只会是:

'Abaixo de Zero (2021).mp4'
'A Sentinela (2021).mp4'
'Eu Me Importo (2021).mp4'
'Loucura de Amor (2021).mp4'

谢谢,如有任何帮助,我们将不胜感激。

您可以利用 bash 字符串操作并将原始文件移动到文件 sub-string,如下所示:

$ touch normal_file_extra
$ fileVar=normal_file_extra
$ echo ${fileVar::-6}
normal_file
$ mv $fileVar ${fileVar::-6}
# previous command substract 6 chars from the original file
$ ls
normal_file

如果您想重命名现有文件,请尝试:

#!/bin/bash

for f in *mp4$'\r'; do
    mv -- "$f" "${f%$'\r'}"
done

假定*mp4 文件位于同一目录中。如果你想递归修复当前目录下的文件名,请尝试:

#!/bin/bash

shopt -s globstar
for f in **/*mp4$'\r'; do
    mv -- "$f" "${f%$'\r'}"
done

顺便说一句,如果您想修复从现在开始下载的文件名,请将您的 awk 命令修改为:

awk '{url=; ="";{sub(/ /,""); sub(/\r$/, "");out=url" -O \""[=12=]"\""}; print out}' file.txt | xargs -L 1 wget

它从 file.txt 中的名称中删除尾随的 CR 字符,然后将更正后的文件名传递给 wget