Не удается переместить файл

Вопрос или проблема

Я пытаюсь выполнить следующую команду, но получаю ошибку “невозможно перезаписать не каталог каталогом”.

find . -type f -name '*.txt' -exec mv bkp {} \;

Папка bkp находится в текущем пути.

Пожалуйста, помогите.

Стандартное использование команды mv:

mv [OPTION]... [-T] SOURCE DEST

То есть первый аргумент, не являющийся опцией, принимается как источник, а второй — как назначение. Таким образом, mv bkp {} \; пытается переместить каталог bkp в {} (последний найденный файл, соответствующий запросу find).

Вам нужно использовать либо mv {} bkp \;, либо (по моему мнению, более безопасно) mv -t bkp {} \;, который использует расширение целевого каталога GNU -t.

Также вы можете рассмотреть возможность перемещения нескольких файлов сразу таким образом:

find . -type f -name '*.txt' -exec mv -t bkp {} +

Однако имейте в виду, что если bkp находится в текущем каталоге, find будет спускаться в него и пытаться переместить его соответствующие файлы обратно в него, поэтому лучше либо переместить его за пределы ., либо использовать тест -prune или ! -path, чтобы пропустить его.

Ответ или решение

Ваше сообщение описывает проблему с перемещением файлов, которая возникает из-за неправильного их назначения в команде mv. Давайте разберем, что происходит и как правильно исправить команду.

Вы используете следующую команду:

find . -type f -name '*.txt' -exec mv bkp {} \;

Ошибка "cannot overwrite non-directory with directory" возникает потому, что команда mv интерпретирует bkp как целевой файл, и, следовательно, пытается переместить его в файл, соответствующий {} (т.е. найденный файл). При этом bkp является директорией и не может быть перемещен в файл.

Чтобы решить эту проблему, вам нужно использовать правильный порядок аргументов в команде mv. Вы можете использовать одну из следующих команд:

  1. Переносите найденные .txt файлы в директорию bkp:
mv {} bkp \;

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

  1. Более эффективный способ — использовать флаг -t, который указывает целевую директорию:
mv -t bkp {} \;
  1. Также вы можете переместить все найденные .txt файлы сразу, используя +, что будет работать еще лучше:
find . -type f -name '*.txt' -exec mv -t bkp {} +

Обратите внимание, что если директория bkp находится в текущей директории, команда find зайдет в нее и будет искать .txt файлы также внутри этой директории. Это может привести к бесконечному циклу или неправильно скопированным/перемещенным файлам. Чтобы избежать этого, лучше переместить директорию bkp за пределы нашей текущей директории или использовать фильтры, такие как -prune или ! -path, чтобы исключить ее из поиска.

Например, вы можете использовать следующую команду, чтобы исключить директорию bkp из поиска:

find . -type f -name '*.txt' ! -path './bkp/*' -exec mv -t bkp {} +

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

Надеюсь, эта информация поможет вам решить вашу проблему! Если у вас остались вопросы, не стесняйтесь спрашивать.

Оцените материал
Добавить комментарий

Капча загружается...