Почему мой 'find' не работает так, как я ожидаю, используя -exec? - PullRequest
14 голосов
/ 17 марта 2009

Я пытаюсь удалить все каталоги .svn из рабочего каталога.

Я думал, что просто использую find и rm вот так:

find . -iname .svn -exec 'rm -rf {}' \;

Но результат:

find: rm -rf ./src/.svn: Нет такого файла или каталога

Очевидно, что файл существует, или находка не может его найти ... Чего мне не хватает?

Ответы [ 6 ]

27 голосов
/ 17 марта 2009

Вы не должны ставить rm -rf {} в одинарные кавычки.

Как вы указали, оболочка обрабатывает все аргументы -exec как команду, а не как команду плюс аргументы, поэтому она ищет файл с именем "rm -rf ./src/.svn" и не находит его.

Попробуйте:

find . -iname .svn -exec rm -rf {} \;
7 голосов
/ 17 марта 2009

Кстати, вы, вероятно, должны избавиться от привычки использовать -exec для вещей, которые можно выполнить с несколькими файлами одновременно. Например, я бы написал это по привычке как

find . -iname .svn -print | xargs rm -rf

или, так как я сейчас использую Macintosh и, скорее всего, столкнусь с именами файлов или каталогов с пробелами в них

find . -iname .svn -print0 | xargs -0 rm -rf 

«xargs» гарантирует, что «rm» вызывается только один раз через каждые «N» файлов, где «N» обычно составляет 20. В этом случае это не очень большой выигрыш, потому что rm мал, но если вы хотели программу Выполнение каждого файла было большим или занимало много времени при запуске, это могло бы сделать все намного быстрее.

3 голосов
/ 11 ноября 2010

возможно это только я, но старый скрипт find & rm не работает на моем текущем конфиге, а-ля:

find / data / bin / test -type d -mtime +10 -name "[0-9] *" -exec rm -rf {} \;

, тогда как решение xargs делает , а-ля:

find / data / bin / test -type d -mtime +10 -name '[0-9] *' -print | xargs rm -rf;

понятия не имею почему, но я обновил свою scriptLib, так что я не трачу еще пару часов на избиение моя голова на что-то так просто ....

(запуск RHEL под ядром-2.6.18-194.11.3.el5)

EDIT : выяснил, почему - мой дистрибутив RHEL по умолчанию использует vi для вставки страшного cr в разрывы строк (которые разбивают команду) - следуя советам nx5000 & jliagre на linuxquestions.org, добавил следующее к ~ / .vimrc:

: установить формат файла = unix

map : установить fileformat = unix

map : установить формат файла = dos

, который позволяет поведению поворачиваться на F4 / F5.

, чтобы проверить, встроены ли CR в ваш файл:

head -1 scriptFile.sh | od -c | голова -1

http://www.linuxquestions.org/questions/linux-general-1/bad-interpreter-no-such-file-or-directory-213617/

1 голос
/ 17 марта 2009

Попробуйте

find . -iname .svn -exec rm -rf {} \;

и это, вероятно, должно работать IIRC.

1 голос
/ 17 марта 2009

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

svn export <url-to-repo> <dest-path>

Смотрите здесь для получения дополнительной информации .

0 голосов
/ 13 декабря 2014

Вы можете передать в кавычки все, что захотите, используя следующий трюк.

find . -iname .svn -exec bash -c 'rm -rf {}' \;

Опция exec будет рада видеть, что вы просто вызываете исполняемый файл с аргументом, но ваш аргумент сможет содержать скрипт практически любого размера и формы.

find . -iname .svn -exec bash -c '
  ls -l "{}" | wc -l
' \;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...