如何在 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
。
我使用此 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
。