Bash Shell脚本将删除一些文件
我有一个花分类的神经网络项目。我有一个花卉数据集,我想将所有雏菊图像重命名为daisy1、daisy2等等。为此我写了一个shell脚本,但我注意到每次运行脚本时,都会丢失一些图像,我不明白为什么。有什么想法吗?这是我的剧本:Bash Shell脚本将删除一些文件,bash,shell,mv,file-management,Bash,Shell,Mv,File Management,我有一个花分类的神经网络项目。我有一个花卉数据集,我想将所有雏菊图像重命名为daisy1、daisy2等等。为此我写了一个shell脚本,但我注意到每次运行脚本时,都会丢失一些图像,我不明白为什么。有什么想法吗?这是我的剧本: (( i = 1 )) for file in $(ls) do [ "$file" != "change-filenames.sh" ] && mv "$file" "daisy$i" && (( i++ )) done 我发现您的
(( i = 1 ))
for file in $(ls)
do
[ "$file" != "change-filenames.sh" ] && mv "$file" "daisy$i" && (( i++ ))
done
我发现您的代码中存在两个风险问题: (1) 您正在使用
ls
生成文件名列表(例如,如果文件名包含空格,则会产生奇怪的结果)
(2) 假设您的目录最初包含文件abc
和daisyabc1
。第一次重命名将是一个mv abc daisyabc1
,因此会破坏原始的daisyabc1
。然后,第二次重命名将是一个mv daisyabc1 daisydaisiyabc2
,最终只会得到一个文件,而原来只有两个文件。我想这就是你丢失文件的原因
顺便说一句,如果
mv
失败,您的计数器(i
)不会增加。我不知道这是一个bug还是出于设计原因。该代码重命名任何名称不同于“change filename.sh”的文件。我怀疑change-filename.sh是一个脚本?您可能希望在重命名之前测试目标名称是否存在。再看看mmv(1)。是的,你是对的。谢谢,谢谢。我将添加条件以控制不良结果。除了用ls生成文件名列表之外,还有更合适的方法获取目录中的文件名吗?顺便说一句,这是设计的。