Это на Mac OS 10.11.
При переименовании файлов в пакете могут происходить удаления файлов.
Пример: 1.txt, 2.txt, 3.txt следует переименовать в 3.txt, 2.txt, 1.txt
При обычном способе 1.txt становится 3.txt (удаляя исходный 3.txt), 2.txt 2.txt, а затем 3.txt (исходный 1.txt) снова становится 1.txt. Только 1.txt и 2.txt остаются.
Чтобы запретить это, на первом шаге я добавляю суффикс ко всем входным именам; на втором шаге я меняю суффиксированные имена на их окончательные выходные имена. Полный пример - сохраните в sh файл и протестируйте для себя:
#!/bin/sh
set -u -x
echo 1 > 1.txt
echo 2 > 2.txt
echo 3 > 3.txt
InputFiles=(1.txt 2.txt 3.txt)
OutputFiles=(3.txt 2.txt 1.txt)
suffix="_rename_cnowjfo_"
i=0
count=3
while (( i < count )); do
mv "${InputFiles[i]}" "${InputFiles[i]}$suffix"
i=$(( i + 1 ))
done
#sleep 3
i=0
while (( i < count )); do
mv -n "${InputFiles[i]}$suffix" "${OutputFiles[i]}"
echo $?
#sleep 0.5
i=$(( i + 1 ))
done
Выполнение этого два раза ({1..3} .txt - {3..1} .txt и {1..3} .txt - {3..1} .txt снова) для сброса исходных имен. в первый раз будет работать нормально, но во второй раз 1.txt удалено по неизвестным причинам.
Второе выполнение с набором -v:
+ (( i < count ))
+ mv 1.txt 1.txt_rename_cnowjfo_
+ i=1
+ (( i < count ))
+ mv 2.txt 2.txt_rename_cnowjfo_
+ i=2
+ (( i < count ))
+ mv 3.txt 3.txt_rename_cnowjfo_
+ i=3
+ (( i < count ))
+ i=0
+ (( i < count ))
+ mv -n 1.txt_rename_cnowjfo_ 3.txt
+ echo 0
0
+ i=1
+ (( i < count ))
+ mv -n 2.txt_rename_cnowjfo_ 2.txt
+ echo 0
0
+ i=2
+ (( i < count ))
+ mv -n 3.txt_rename_cnowjfo_ 1.txt
+ echo 0
0
+ i=3
+ (( i < count ))
Теперь я раскомментирую вышеприведенную команду сна, и все, кажется, работает как положено. Похоже, что без команды sleep mv, возможно, не завершил свою работу, несмотря на выход.
То же самое происходит, если я вручную выполняю все 6 команд:
mv 1.txt 1.txt_rename_cnowjfo_; mv 2.txt 2.txt_rename_cnowjfo_; mv 3.txt 3.txt_rename_cnowjfo_; mv 1.txt_rename_cnowjfo_ 3.txt; mv 2.txt_rename_cnowjfo_ 2.txt; mv 3.txt_rename_cnowjfo_ 1.txt
То же самое происходит во всех протестированных мной файловых системах: расширенная версия MAC OS, ExFAT и FAT16.
Как выйти из программы, не выполнив полностью работу?