gpt4 book ai didi

linux - 使用命令行参数Bash更改文件名

转载 作者:太空宇宙 更新时间:2023-11-04 04:54:50 25 4
gpt4 key购买 nike

我需要实现一个脚本(duplq.sh),该脚本将使用命令行参数重命名当前目录中存在的所有文本文件。因此,如果执行命令duplq.sh pic 0 3,它将执行以下转换:

pic0.txt必须重命名pic3.txt

pic1.txtpic4.txt

pic2.txtpic5.txt

pic3.txtpic6.txt

等等…

因此,第一个参数始终是文件名,第二个和第三个参数始终是正数。

我还需要确保执行脚本时,第一次重命名(将pic0.txt更改为pic3.txt)不会删除当前目录中现有的pic3.txt文件。

这是我到目前为止所做的:

 #!/bin/bash

name="$1"
i="$2"
j="$3"


for file in $name*
do
echo $file
find /var/log -name 'name[$i]' | sed -e 's/$i/$j/g'
i=$(($i+1))
j=$(($j+1))
done


但是find命令似乎不起作用。您还有其他解决方案吗?

最佳答案

您要解决的问题实际上有些棘手,而且我认为您尚未完全解决。例如,duplq.sh pic 0 3duplq.sh pic 2 5有什么区别-看起来两者都应该在数字上加3,还是第二个跳过“ pic0.txt”和“ pic1.txt”?任何一个都会对名为“ pic”,“ pic.txt”,“ picture.txt”,“ picture2.txt”,“ pic2-2.txt”或“ pic999.txt”的文件产生什么影响。

到目前为止,您在脚本中还存在许多基本错误:


您应该(几乎)始终将变量引用放在双引号中,以避免意外的单词拆分和通配符扩展。因此,例如,使用echo "$file"代替echo $file。在for file in $name*中,应在变量周围加上双引号,但不要在*旁加上双引号,因为您希望将其视为通配符。因此,正确的版本是for file in "$name"*
不要将变量引用放在单引号中,它们不会在那里被扩展。因此,在findsed命令中,您没有传递变量的值,而是传递了文字后跟字母的美元符号。同样,请使用双引号。另外,在“名称”之前没有“ $”,因此即使使用双引号也不会将其视为变量。
但是findsed命令不会执行您想要的任何操作。考虑find /var/log -name "name[1]" -查找名为“ name1”而不是“ name1” +扩展名的文件。它会在当前目录和所有子目录中查找,我敢肯定您不需要。并且“ 1”("$i")可能不是当前文件名中的数字。假设有名为“ pic0.jpg”,“ pic0.png”和“ pic0.txt”的文件-在第一个迭代中,循环可能会找到所有三个像“ pic0 *”这样的模式,然后在第二个第三次迭代尝试查找不存在的“ pic1 *”和“ pic2 *”。另一方面,假设存在名为“ pic0.txt”,“ pic5.txt”和“ pic8.txt”的文件-再次,它可能会寻找“ pic0 *”(确定),然后寻找“ pic1 *”(未找到),然后寻找“ pic2 *”(同上)。

另外,如果使用多位数,则模式“名称[10]”将匹配“ file0”和“ file1”,但不匹配“ file10”。我不知道您为什么在这里加上括号,但是他们什么也不想做。

您已经在$file变量中一次列出了一个文件,使用不同的条件再次搜索只会增加混乱。
另外,在脚本中,您实际上没有重命名任何内容。 find | sed行将(如果可行)打印文件的新名称,但实际上不会重命名。

顺便说一句,当您确实使用mv命令时,如果发生名称冲突,请使用mv -nmv -i使其保持无声且不可恢复地覆盖文件。
为了防止在增加文件编号时覆盖,您需要按相反的数字顺序进行重命名(即,在将“ pic0.txt”重命名为“ pic3.txt”之前,将“ pic3.txt”重命名为“ pic6.txt”)。这特别棘手,因为如果仅按相反的字母顺序对文件名进行排序,则在“ pic10.txt”之前会得到“ pic7.txt”。但是,如果不先删除“ pic”和“ .txt”部分,就无法进行数字排序。

IMO这实际上是要使此脚本正常工作需要解决的最棘手的问题。将最大的索引号指定为参数之一,然后从那里开始并递减至0(循环遍历数字而不是文件),然后对每个数字遍历匹配的文件(例如“ pic0.jpg”),这可能是最简单的”,“ pic0.png”和“ pic0.txt”)。

关于linux - 使用命令行参数Bash更改文件名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49969730/

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