![通过将逗号和空格替换为下划线来更改多个文件名](https://linux22.com/image/1187885/%E9%80%9A%E8%BF%87%E5%B0%86%E9%80%97%E5%8F%B7%E5%92%8C%E7%A9%BA%E6%A0%BC%E6%9B%BF%E6%8D%A2%E4%B8%BA%E4%B8%8B%E5%88%92%E7%BA%BF%E6%9D%A5%E6%9B%B4%E6%94%B9%E5%A4%9A%E4%B8%AA%E6%96%87%E4%BB%B6%E5%90%8D.png)
我的文件格式为
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
答案3
如果你对 vim 很满意,并且不反对使用其他语言mv
,那么你可以考虑病毒。我喜欢用它进行批量重命名,因为它让我在操作之前就能看到自己在做什么。(而且因为我喜欢 vim。)
编辑2022-07-08:重新阅读文档后,似乎您不必使用 vim。可以告诉 vimv 使用其他编辑器。
编辑2022-07-09:有人向我指出,我的回答没有提供足够的细节,不能被视为问题的答案。
vimv 重命名(或删除)文件的方法是在您喜欢的文本编辑器中打开文件列表。在那里,您可以随意编辑每个文件名,但您需要在编辑器中执行此操作。(要删除文件,请将其替换为空白行。)退出编辑器后,文件将根据您的编辑移动(或删除)。
答案4
如果你想要更接近mv
,你可以尝试mmv
以通配符模式进行操作。例如,
mmv "*",\ "*" "#1"_"#2"
将全部转换,\
为_
。因此,mmv
再应用两次即可获得您想要的示例。它在存储库中可用,其手册页也非常有用。
当然,如果您的文件名不属于良好的全局模式,那么正则表达式可能是更好的选择。