步骤1

步骤1

与丢失文件相关的问题mv似乎没有回答我的问题。在文件所在的工作目录中运行以下命令,导致文件丢失。


步骤1

$layers我有一个使用以下命令创建的已排序文件名数组layers=$(ls cropped* | sort -nk1.9)

IFS=$'\n';for file in $layers; do echo $file; done  
cropped_1.png  
cropped_2-a.png  
cropped_2-b.png    
cropped_2.png  
cropped_3-a.png  
cropped_3-b.png  
cropped_3.png  
cropped_4-a.png  
cropped_4-b.png  
cropped_4-c.png  
cropped_4-d.png  
cropped_4-e.png  
cropped_4-f.png  
cropped_4-g.png  
cropped_4.png  
cropped_5-a.png  
cropped_5-b.png  
cropped_5.png  
--More--

第2步

我运行以下循环来替换每个文件名中 _ 后面的所有内容:

i=1;IFS=$'\n';for file in $layers; do echo ${file/#*_*/cropped_$((i++)).png}; done  
cropped_1.png
cropped_2.png
cropped_3.png
cropped_4.png
cropped_5.png
cropped_6.png
cropped_7.png
cropped_8.png
cropped_9.png
cropped_10.png
cropped_11.png
cropped_12.png
cropped_13.png
cropped_14.png
cropped_15.png
cropped_16.png
cropped_17.png
--More--

第三步 - 危险,威尔·罗宾逊!

到目前为止这看起来不错。因此,我尝试mv使用以下循环重命名每个文件,我预计这会导致类似mv cropped_2-a.png cropped_2.png、thenmv cropped_2-b.png cropped_3.png等的结果:

i=1;IFS=$'\n';for file in $layers; do mv $file ${file/#*_*/cropped_$((i++)).png}; done

这给第一个文件带来了一个错误。

mv: 'cropped_1.png' 和 'cropped_1.png' 是同一个文件

我认为它会对每个mv SOURCE DEST匹配的文件名给出此错误。相反,它只在循环中的第一个文件上给出错误。

奇怪的是,许多文件现在丢失了。唯一剩下的文件如下:

ls cropped* | sort -nk1.9
cropped_1.png
cropped_141.png
cropped_142.png
cropped_143.png
cropped_144.png
cropped_145.png
cropped_146.png
cropped_147.png
cropped_148.png
cropped_149.png
cropped_150.png
cropped_151.png
cropped_152.png
cropped_153.png
cropped_154.png
cropped_155.png

问题

丢失的文件移到哪里了?

在我创建了一些名称重复的文件之前,共有 140 个文件,cropped_2-a.png总共 155 个文件。如果文件 141-155 移动成功,那么文件 2-140 在哪里?为什么他们没有移动到预期的目的地?当前工作目录?


笔记

如果我不添加名称为 的文件cropped_2-a.png,则循环将显示每个文件的错误消息,并且文件保持不变:

i=1;IFS=$'\n';for file in $layers; do mv $file ${file/#*_*/cropped_$((i++)).png}; done
mv: ‘cropped_1.png’ and ‘cropped_1.png’ are the same file
mv: ‘cropped_2.png’ and ‘cropped_2.png’ are the same file
mv: ‘cropped_3.png’ and ‘cropped_3.png’ are the same file
mv: ‘cropped_4.png’ and ‘cropped_4.png’ are the same file
mv: ‘cropped_5.png’ and ‘cropped_5.png’ are the same file
--More--

我已经使用诸如cropped_2a.png(no -) 之类的文件名进行了测试,它重复了丢失文件的问题。

当我尝试mv -v查看发生了什么时,它似乎正在按预期重命名文件,但当我检查时,文件丢失了。包装参数替换1 ${file/#*_*/cropped_$((i++)).png}双引号中并不能解决这个问题。

i=1;IFS=$'\n';for file in $layers; do mv -v $file "${file/#*_*/cropped_$((i++)).png}"; done
‘cropped_2-a.png’ -> ‘cropped_2.png’
‘cropped_2-b.png’ -> ‘cropped_3.png’
‘cropped_2.png’ -> ‘cropped_4.png’
‘cropped_3-a.png’ -> ‘cropped_5.png’
‘cropped_3-b.png’ -> ‘cropped_6.png’
‘cropped_3.png’ -> ‘cropped_7.png’
‘cropped_4.png’ -> ‘cropped_8.png’
‘cropped_5.png’ -> ‘cropped_9.png’
‘cropped_6.png’ -> ‘cropped_10.png’
--More--

mv使用参数替换作为目标参数来 测试更简单的命令:

testy="cropped_2-b.png"
mv -iv $testy ${testy/#*_*/cropped_999.png}

这也有效:

i=998
testy="cropped_2-b.png"
mv -iv $testy ${testy/#*_*/cropped_$((i++)).png}

'cropped_2-b.png' -> 'cropped_998.png'

testy="cropped_3-a.png"
mv -iv $testy ${testy/#*_*/cropped_$((i++)).png}

'cropped_3-a.png' -> 'cropped_999.png'

我无法确定在显示相同文件错误后 for 循环期间失败的原因或文件实际去向的原因。

答案1

cropped_2-a.png被更名为cropped_2.png.这取代了原来的cropped_2.png.然后 2 行后,该文件被重命名为cropped_4.png.

避免此问题的最佳方法是在重新编号时将文件移动到另一个最初为空的目录中,这样您就不必担心新名称与旧名称冲突。然后,当循环完成时,您可以将重命名的文件移回原始目录。

相关内容