我正在尝试创建一个重命名一组文件的脚本。通常它们将是 TIF,但有时可能会偶尔出现奇怪的问题,所以我想重命名文件并忽略文件扩展名。
文件名将全部相同,中间抛出的纪元时间作为区分符。最终结果将与此类似:
Name1=CLMSFILE
Name2=Epoch
Name3=_A BUNCH OF OTHERTEXT_WITH_A_MIXTURE OF UNDERSCORES AND_SPACES
CLMSFILE53253_A BUNCH OF OTHERTEXT_WITH_A_MIXTURE OF UNDERSCORES AND_SPACES.TIF (or other extension)
这是我目前拥有的
#Rename files and insert epoch time
name1=$CLMSFILE
name2=$(date +%s%3N)
name3=$_A\ BUNCH\ OF\ OTHERTEXT_WITH_A_MIXTURE\ OF\ UNDERSCORES\ AND_SPACES
for f in *; do
newname=$name1$name2$name3
mv -n "$f" "${newname}"
done
运行此之后,我只重命名了第一个文件,但它忽略了第一个变量并且没有扩展名。
1653049404956 _A BUNCH OF OTHERTEXT_WITH_A_MIXTURE OF UNDERSCORES AND_SPACES
220220217SOMEORG20003_01.TIF
220220217SOMEORG30004_01.TIF
您的 shell 脚本中有几个问题会导致您观察到错误:
你说第一个名字部分是CLSMFILE
。但是,在您声明的变量分配中,您将名为 的shell 变量name1=$CLMSFILE
的内容分配给第一部分,该变量可能不存在,因此为空。这部分实际上也是如此,但是您碰巧以 , 开头的字符串,并且在 shell 中具有特殊含义,因此解释在 之后立即停止,并且字符串的其余部分未更改地导入到您的变量中。CLSMFILE
name3
_
$_
_
您的脚本会尝试将所有文件重命名为相同的名称。幸运的是,您使用了该-n
选项,否则您将丢失目录中除最后一个文件之外的所有文件。
原因是date
命令 inname2=$(date ...)
仅在赋值时进行评估,而不是每次使用$name2
变量时。所以它对于循环的所有迭代都是恒定的。
您声明您想要一个文件扩展名,但您忘记为文件添加扩展名。mv
重命名整个 filename,而不仅仅是 之前的部分,仅仅是因为文件名中允许有.
多个。.
我建议您使用shellcheck
,也可作为独立工具使用,以捕获 shell 脚本中的错误。
以下修改应该有效:
name1="CLMSFILE"
name3="_A BUNCH OF OTHERTEXT_WITH_A_MIXTURE OF UNDERSCORES AND_SPACES"
for f in *; do
basename=${f%.*}
newbasename="$name1$(date +%s%3N)$name3"
newname=${f/$basename/$newbasename}
mv -n "$f" "${newname}"
done
这使用 shell 字符串操作来
$f
,即直到最后一个.
分隔部分的所有内容,存储在一个变量中$basename
date
每次循环迭代时运行该命令$basename
子字符串$f
替换为$newbasename
理想情况下,你会用类似的mv -n ...
东西替换零件
echo "Renaming '$f' to '$newname'"
直到您确定名称生成逻辑正常工作。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句