Раз уж зашла речь про "правильное" перемещение файлов, я бы хотел задать похожий, хотя и немного более интересный, вопрос.
Задача простая: переместить все файлы из поддиректории в родительскую директорию. Файлы с такими же именами _не_ должны быть перезаписаны, и (самое главное), если совпадения имен были, должна быть возможность однозначно сказать _какие_ файлы не удалось переместить.
Для тестирования решения, я полагаю, будет достаточно корректной работы на следующей директории:
Код: Выделить всё
$ cat create_test.sh
#!/bin/sh
set -euf
mkdir -p dir/b dir/src/b dir/src/src/a dir/src/src/b
echo 'top b' > dir/b/b.tmp
echo '1st b' > dir/src/b/b.tmp
echo '2nd b' > dir/src/src/b/b.tmp
echo '2nd a' > dir/src/src/a/a.tmp
Ну, а теперь, собственно, мои "примечения" по поводу возможных решений.
1. Использовать `mv` видимо не получится совсем. Вот примеры
Код: Выделить всё
$ mv -i src -T .
mv: overwrite `.'? y
mv: cannot move `src' to `.': Device or resource busy
Второй вариант:
Код: Выделить всё
$ mv -vi src/* -t .
mv: overwrite `./b'? n
mv: overwrite `./src'? y
mv: cannot move `src/src' to `./src': Directory not empty
Оба варианта не работает даже вручную. Не говоря уже про то, что эти ответы должны быть автоматическими. Опция '-n' здесь тоже работать не будет, тк она ответит "нет" на все вопросы, а, как видно из "ручных" вариантов, надо отвечать "нет" не на все вопросы.
2. Можно попробовать cp, и на этот раз действительно кое-что получится. Например, можно использовать хардлинки, как индикатор того, скопировался файл или нет:
И затем я могу посмотреть файлы, которые переместить не удалось:
Код: Выделить всё
$ find -type f -links 1
./src/src/b/b.tmp
./src/b/b.tmp
./b/b.tmp
Если b/b.tmp в dir удалить, то получится вот так:
Код: Выделить всё
$ rm -rf b
$ cp -PRln src/ -T .
$ find -type f -links 1
./src/src/b/b.tmp
Одним словом, если не считать, что решение дурацкое, то все работает. Собственно, чем мне оно не нравится?
- Не очевидное.
- Требует, чтобы фс поддерживала хардлинки.
- Поддиректория src и родительская директория dir должны быть на одной фс.
- Файлы не должны иметь хардлинков изначально.
3. (в этот пункт вы можете вписать свое решение

)