通过将逗号和空格替换为下划线来更改多个文件名

通过将逗号和空格替换为下划线来更改多个文件名

我的文件格式为

Country, City S1.txt

例如

USA, Los Angeles S1.txt
USA, San Francisco S3.txt
UK, Glouchester S4.txt
Argentina, Buenos Aires S7.txt

我希望将它们改为

Country_City_S1.txt

例如

USA_Los_Angeles_S1.txt
USA_San_Franciso_S3.txt
UK_Glouchester_S4.txt
Argentina_Buenos_Aires_S7.txt

有人能帮我吗,最好使用mv命令?谢谢。

答案1

#!/bin/bash

for f in *.txt; do # Work on files with ".txt" extension in the current working directory assigning their names one at a time(for each loop run) to the variable "$f"
    IFS=', ' read -r -a array <<< "$f" # Split filename into parts/elements by "," and " " and read the elements into an array
    f1=$(IFS="_$IFS"; printf "${array[*]}"; IFS="${IFS:1}") # Set the new filename in the variable "$f1" by printing array elements and adding "_" inbetween.
    echo mv -n -- "$f" "$f1" # Renaming dry-run(simulation) ... Remove "echo" when satisfied with output to do the actual renaming.
done

或者

#!/bin/bash

shopt -s extglob # Turn on "extglob"

for f in *.txt; do # Work on files with ".txt" extention in the current working directory assigning their namese one at a time(for each loop run) to the fariable "$f"
    echo mv -n -- "$f" "${f//+([, ])/_}" # Renaming dry-run(simulation) ... Remove "echo" when satisfied with output to do the actual renaming.
done

答案2

使用 Perl 的rename(提及这里这里不要混淆与其他重命名):

rename 's/,? /_/g' *.txt     # Or rename 's/(, | )/_/g' *.txt

可以与以下内容一起使用-vn:(--verbose打印成功重命名的文件的名称)和--nono(打印要重命名的文件的名称,但不重命名。

答案3

如果你对 vim 很满意,并且不反对使用其他语言mv,那么你可以考虑病毒。我喜欢用它进行批量重命名,因为它让我在操作之前就能看到自己在做什么。(而且因为我喜欢 vim。)

编辑2022-07-08:重新阅读文档后,似乎您不必使用 vim。可以告诉 vimv 使用其他编辑器。

编辑2022-07-09:有人向我指出,我的回答没有提供足够的细节,不能被视为问题的答案。

vimv 重命名(或删除)文件的方法是在您喜欢的文本编辑器中打开文件列表。在那里,您可以随意编辑每个文件名,但您需要在编辑器中执行此操作。(要删除文件,请将其替换为空白行。)退出编辑器后,文件将根据您的编辑移动(或删除)。

答案4

如果你想要更接近mv,你可以尝试mmv以通配符模式进行操作。例如,

mmv "*",\ "*" "#1"_"#2"

将全部转换,\_。因此,mmv再应用两次即可获得您想要的示例。它在存储库中可用,其手册页也非常有用。

当然,如果您的文件名不属于良好的全局模式,那么正则表达式可能是更好的选择。

相关内容