Mv: не может перезаписывать каталог с не-каталогом

Можно ли обойти эту проблему?

У меня есть ситуация, когда мне нужно переместить некоторые файлы в один каталог ниже.

/a/b/c/d/e/f/g

проблема заключается в том, что имя файла внутри каталога g/ совпадает с именем каталога

и я получаю следующую ошибку:

mv: cannot overwrite directory `../297534' with non-directory

Пример: /home/user/data/doc/version/ 3766/297534 - это каталог, внутри которого также есть файл с именем 297534

поэтому мне нужно переместить этот файл внутри /home/user/data/doc/version/ 3766

Команда Это то, что я запускаю: (в цикле for)

cd /home/user/data/doc/version/3766/297534
mv * ../

Ответ 1

Вы не можете заставить mv перезаписать каталог с файлом с тем же именем. Вам нужно будет удалить этот файл, прежде чем использовать команду mv.

Ответ 2

Добавьте еще один слой в ваш цикл.

Замените mv * ../ на

for f in `ls`; do rm -rf ../$f; mv $f ..; done

Это гарантирует, что любой конфликт будет удален первым, предполагая, что вам не нужен каталог, который вы переписываете.

Обратите внимание, что это взорвется, если у вас есть файл внутри текущего каталога, который соответствует текущему имени каталога. Например, если вы находитесь в /home/user/data/doc/version/3766/297534, и вы пытаетесь переместить каталог с именем 297534 вверх. Один обходной путь к этому - добавить длинный суффикс к каждому файлу, так что мало шансов на совпадение

for f in `ls`; do mv $f ../${f}_abcdefg; done