Bash: mv удаляет файлы, потому что он существует, несмотря на то, что переименование еще не закончено - PullRequest
0 голосов
/ 05 ноября 2018

Это на 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.

Как выйти из программы, не выполнив полностью работу?

1 Ответ

0 голосов
/ 05 ноября 2018

Решение довольно простое по моей вине - не проверять окончательные результаты с помощью оболочки, а вместо этого с помощью приложения Finder. Похоже, что Finder перегружен быстрыми изменениями, и только после уничтожения и перезапуска показывает все 3 файла. ls мгновенно показывает, что все 3 файла были правильно переименованы.

Никогда не полагайтесь на графический интерфейс, чтобы получить надежный просмотр ваших файлов!

...