Вопрос или проблема
Я пытаюсь выполнить следующую команду, но получаю ошибку “невозможно перезаписать не каталог каталогом”.
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
. Вы можете использовать одну из следующих команд:
- Переносите найденные
.txt
файлы в директориюbkp
:
mv {} bkp \;
Однако, этот метод переместит файлы один за другим, что не всегда эффективно.
- Более эффективный способ — использовать флаг
-t
, который указывает целевую директорию:
mv -t bkp {} \;
- Также вы можете переместить все найденные
.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
.
Надеюсь, эта информация поможет вам решить вашу проблему! Если у вас остались вопросы, не стесняйтесь спрашивать.