gpt4 book ai didi

bash - 使用 shell 脚本批量重命名

转载 作者:行者123 更新时间:2023-11-29 09:17:52 25 4
gpt4 key购买 nike

我有一个文件夹,其中的文件名为

input (1).txt
input (2).txt
input (3).txt
...
input (207).txt

如何将它们重命名为

input_1.in
input_2.in
input_3.in
...
input_207.in

我正在尝试这个

for f in *.txt ; do mv $f `echo $f | sed -e 's/input\ (\(\d*\))\.txt/input_\1.in/'` ; done

但它给了我

mv: target `(100).txt' is not a directory
mv: target `(101).txt' is not a directory
mv: target `(102).txt' is not a directory
...

我哪里出错了?


我现在已经加上引号了,但我现在明白了

mv: `input (90).txt' and `input (90).txt' are the same file

它正在以某种方式尝试将文件重命名为相同的名称。这是怎么发生的?

最佳答案

那是因为 bash for 用空格 ' ' 分割了元素,所以你命令它将 'input' 移动到 '(1)'.

解决这个问题的方法是告诉 bash 使用 IFS 变量按新行拆分。

像这样:

IFS=$'\n'

然后执行你的命令。

但是,我建议您使用 find 来执行此操作,而不是使用 -exec 命令。

例如:

find *.txt -exec mv "{}" `echo "{}" | sed -e 's/input\ (\([0-9]*\))\.txt/input_\1.in/'` \;

注意:这是我凭内存写的,我确实测试过,所以让我们试着调整一下。

希望这对您有所帮助。

关于bash - 使用 shell 脚本批量重命名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3540490/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com