Поиск и Удаление файлов

Программирование на sh, быть может немного про альтернативные языки
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
fanbass
мл. сержант
Сообщения: 70
Зарегистрирован: 2009-03-26 11:07:26
Откуда: Санкт-Петербург
Контактная информация:

Поиск и Удаление файлов

Непрочитанное сообщение fanbass » 2009-05-26 16:11:05

FreeBSD-7.2. Командная оболочка - csh.
Необходимо найти и удалить файлы.
В man find нашёл ключ -delete, который позволяет удалить найденные файлы и директории.
Я набираю:

Код: Выделить всё

find /usr -name "fr_FR*" -delete
Незнаю что комп там дальше делает, но сложилось мнение, что ничего т.к.

Код: Выделить всё

find /usr -name "fr_FR*"
- выводит кучу файлов, которые я хтелбы удалить. :(
Подскажите, что я делаю не так?

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Аватара пользователя
Mox
лейтенант
Сообщения: 757
Зарегистрирован: 2008-12-16 16:04:14
Откуда: питер
Контактная информация:

Re: Поиск и Удаление файлов

Непрочитанное сообщение Mox » 2009-05-26 16:17:46

все вроде правильно, должен удалять. может прав не хватает.
оболочка непричем
"В мире программирования алгоритмы становятся более важными, чем код, и именно из-за академических корней в BSD изначально большое внимание уделялось проработке алгоритмов". Мэтт Диллон

ronin
рядовой
Сообщения: 14
Зарегистрирован: 2007-12-20 17:58:07

Re: Поиск и Удаление файлов

Непрочитанное сообщение ronin » 2009-05-26 18:45:56

В скрипте все верно вы указали. Вопрос топикостартеру. Из под кого запускаете скрипт?

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: Поиск и Удаление файлов

Непрочитанное сообщение zg » 2009-05-27 8:11:06

fanbass писал(а):- выводит кучу файлов, которые я хтелбы удалить.
дак добавь конвеер-удалялку

Код: Выделить всё

find /usr -name "fr_FR*" | xargs rm

fanbass
мл. сержант
Сообщения: 70
Зарегистрирован: 2009-03-26 11:07:26
Откуда: Санкт-Петербург
Контактная информация:

Re: Поиск и Удаление файлов

Непрочитанное сообщение fanbass » 2009-05-27 10:19:32

Попытка поиска и удаления производилась из под root.
zg писал(а):... дак добавь конвеер-удалялку

Код: Выделить всё

find /usr -name "fr_FR*" | xargs rm
Можно конечно и так, попробую, но будет ли такой скрипт удалять директории? т.к. rm удаляет только файлы. А вся прелесть -delete в том и заключается, что удаляет и файлы и директории!
Вопрос не снимается т.к. -delete тоже должен работать.
Тем более, что об этом ключе пишут, что он из всего семейства BSD есть только в FreeBSD. Если я всё таки делаю всё правельно, а оно не работает походу нужно писать разработчикам...

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: Поиск и Удаление файлов

Непрочитанное сообщение zg » 2009-05-27 10:32:05

fanbass писал(а):но вопрос не снимается т.к. -delete тоже должен работать.
оно и работает, просто либо у тебя прав не хватает, либо не так запускаешь

Код: Выделить всё

zg# touch test/for-delete.txt
zg# find . -name for-delete.txt
./test/for-delete.txt
zg# find . -name for-delete.txt -delete
zg# find . -name for-delete.txt
zg#
не забывай, что удаление каталогов дело ответственное и просто так не будет работать

Код: Выделить всё

zg# mkdir test/for-delete
zg# touch test/for-delete/test.txt
zg# find . -name for-delete
./test/for-delete
zg# find . -name for-delete -delete
zg# find . -name for-delete
./test/for-delete
zg#
если нужно удаление вместе с каталогами, то

Код: Выделить всё

zg# find . -name for-delete | xargs rm -rf
zg# find . -name for-delete
zg#
но это крайне небезопасный вариант

fanbass
мл. сержант
Сообщения: 70
Зарегистрирован: 2009-03-26 11:07:26
Откуда: Санкт-Петербург
Контактная информация:

Re: Поиск и Удаление файлов

Непрочитанное сообщение fanbass » 2009-05-27 11:52:22

zg
У тебя какая версия FreeBSD?
Кстате ты ищеш конкретный файл, а я ищю все файлы и директории fr_FR.
Вот что получается у меня Работая под root (см. вложения)
zg писал(а):оно и работает, просто либо у тебя прав не хватает, либо не так запускаешь
Как видим ничего удаляться ни желает :(
Что там может быть не так?
Вложения
freebsd_screen.png
freebsd_screen.png (8.96 КБ) 9271 просмотр

Аватара пользователя
terminus
майор
Сообщения: 2305
Зарегистрирован: 2007-10-29 11:27:35
Откуда: Рига

Re: Поиск и Удаление файлов

Непрочитанное сообщение terminus » 2009-05-27 11:55:57

Код: Выделить всё

find / -name "fr_FR*" -exec chflags -R 0 {} \;
find / -name "fr_FR*" -delete
Модель: AST-PM-105/0044; Тип: Универсальный, ремонтный; Название: Терминус; Род повреждения: Распад функций; Выводы: Сдать на слом.

fanbass
мл. сержант
Сообщения: 70
Зарегистрирован: 2009-03-26 11:07:26
Откуда: Санкт-Петербург
Контактная информация:

Re: Поиск и Удаление файлов

Непрочитанное сообщение fanbass » 2009-05-27 12:11:54

terminus писал(а):

Код: Выделить всё

find / -name "fr_FR*" -exec chflags -R 0 {} \;
find / -name "fr_FR*" -delete
А немного слов по русски, пожайлуста. Если несложно. :smile:

Аватара пользователя
terminus
майор
Сообщения: 2305
Зарегистрирован: 2007-10-29 11:27:35
Откуда: Рига

Re: Поиск и Удаление файлов

Непрочитанное сообщение terminus » 2009-05-27 12:21:03

"Неудаляемые рутом" файлы это те, на которых стоят флаги (man chflags). Первая команда снимает все-все флаги и делает это рекурсивно вниз по дереву найденного каталога. Вторая удаляет.

---

Кнструкция -exec {} \; означает - выполнить над результатом поиска указанную команду подсунув ей найденное

запустив:

Код: Выделить всё

find / -name "fr_FR*" -exec chflags -R 0 {} \;
получится выролнение:

Код: Выделить всё

chflags -R 0 /usr/local/share/fr_Fr1/
chflags -R 0 /usr/local/share/fr_Fr2/
chflags -R 0 /usr/local/share/fr_Fr3/
Модель: AST-PM-105/0044; Тип: Универсальный, ремонтный; Название: Терминус; Род повреждения: Распад функций; Выводы: Сдать на слом.

fanbass
мл. сержант
Сообщения: 70
Зарегистрирован: 2009-03-26 11:07:26
Откуда: Санкт-Петербург
Контактная информация:

Re: Поиск и Удаление файлов

Непрочитанное сообщение fanbass » 2009-05-29 11:37:03

Про флаги я и забыл. Но опять-же chflags применяется только к файлам, но не к папкам.
Есть системный признак неудаляемости файла - sunlink. Его присутствие можно увидеть набрав:

Код: Выделить всё

#ls -lo file
Результат:

Код: Выделить всё

-rw-r--r--  ....  sunlnk 0 May  1 05:54 file
Чтобы отключить флаг неудаляемости, нужно выполнить команду:

Код: Выделить всё

# chflags nosunlink file
Повторюсь - это работает только для файлов!
Я посмотрел права доступа на папку:

Код: Выделить всё

/usr/local/share/locale/fr_FR
Результат примерно такой:

Код: Выделить всё

drwxr--r--
Может эта папка не удаляется из-за того , что там есть файлы, которые нельзя удалить? Зашёл внутрь - там ещё одна папка с темиже правами, а дальше пусто. Спрашивается почему она не удаляется после команды!?:

Код: Выделить всё

#find / -name "fr_FR*" -delete
Набрав:

Код: Выделить всё

#rm -r fr_FR
всё благополучно удалилось!
Дальше ещё смешней :smile: Взял я следующую строку из списка найденного (см. предыдущий мой ответ - вложения)
В папке fr_FR.ISO8859-1 действительно есть файлы с правами:

Код: Выделить всё

-r--r--r--
Но набрав:

Код: Выделить всё

#rm -r fr_FR.ISO8859-1
всё сново благополучно удалилось, без изменения прав на файлы!
Вывод напрашивается сам собой, команда:

Код: Выделить всё

#find / -name "fr_FR*" -delete
Не работает!!!
Вобщем вопрос открыт...

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: Поиск и Удаление файлов

Непрочитанное сообщение zg » 2009-05-29 12:39:10

fanbass писал(а):Не работает!!!
читать то не?

Код: Выделить всё

     -delete
             Delete found files and/or directories.  Always returns true.
             This executes from the current working directory as find recurses
             down the tree.  It will not attempt to delete a filename with a
             ``/'' character in its pathname relative to ``.'' for security
             reasons.  Depth-first traversal processing is implied by this
             option.

fanbass
мл. сержант
Сообщения: 70
Зарегистрирован: 2009-03-26 11:07:26
Откуда: Санкт-Петербург
Контактная информация:

Re: Поиск и Удаление файлов

Непрочитанное сообщение fanbass » 2009-05-29 13:42:08

Я в английском не особо силён. Если я правельно понял, то с помощью:

Код: Выделить всё

find / -name file -delete
нельзя удалить файлы и директории содержащие символы "/", "_", "-"...? Для какой-то там защиты.
А этому методу без разницы какие символы содержаться в названии файла/директории?:
zg писал(а):Код: Выделить всё • Развернуть

zg# find . -name for-delete | xargs rm -rf
zg# find . -name for-delete
zg#
fanbass писал(а):но это крайне небезопасный вариант
В чём опасность?

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: Поиск и Удаление файлов

Непрочитанное сообщение zg » 2009-05-29 14:58:26

fanbass писал(а):В чём опасность?
это всё равно, что

Код: Выделить всё

rm -rf /**

fanbass
мл. сержант
Сообщения: 70
Зарегистрирован: 2009-03-26 11:07:26
Откуда: Санкт-Петербург
Контактная информация:

Re: Поиск и Удаление файлов

Непрочитанное сообщение fanbass » 2009-05-29 15:42:03

zg писал(а):это всё равно, что

Код: Выделить всё • Развернуть

rm -rf /**
А, что тогда делать?
Как можно безопасно и побыстрому удалить файлы типа *_*

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: Поиск и Удаление файлов

Непрочитанное сообщение zg » 2009-05-29 16:09:57

fanbass писал(а):Как можно безопасно и побыстрому удалить файлы типа *_*
сначала проверяешь, что находит find, потом подставляешь конвеер rm -rf

Гость
проходил мимо

Re: Поиск и Удаление файлов

Непрочитанное сообщение Гость » 2009-06-04 23:20:18

zg писал(а):сначала проверяешь, что находит find, потом подставляешь конвеер rm -rf
только если использовать xargs без `-0', то на файле/папке с пробелом в имени могут появится аномалии вплоть до `rm -rf /' ;)
нет чтобы использовать -exec люди придумывают велосипеды с xagrgs...

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: Поиск и Удаление файлов

Непрочитанное сообщение zg » 2009-06-05 6:15:22

Гость писал(а):только если использовать xargs без `-0', то на файле/папке с пробелом в имени могут появится аномалии вплоть до `rm -rf /' ;)
да собственно и с ним ничего хорошего нет

Код: Выделить всё

zg# touch "hello world.txt"
zg# ls -la
total 76
d-wx--x--x   3 zg    wheel    512  5 июн 08:10 .
drwxr-xr-x  13 zg    wheel   1024 30 май 10:55 ..
-rwxr-xr-x   1 root  wheel    281 23 апр 19:46 1.sh
drwxr-xr-x   2 root  wheel    512 23 апр 19:37 ff
-rw-r--r--   1 root  wheel      0  5 июн 08:10 hello world.txt
-rw-r--r--   1 root  wheel  68084 23 апр 19:03 ubstr
zg# find . -name "*.txt" -type f | xargs ls -la
ls: ./hello: No such file or directory
ls: world.txt: No such file or directory
zg# find . -name "*.txt" -type f | xargs -O ls -la
xargs: illegal option -- O
usage: xargs [-0opt] [-E eofstr] [-I replstr [-R replacements] [-S replsize]]
             [-J replstr] [-L number] [-n number [-x]] [-P maxprocs]
             [-s size] [utility [argument ...]]
zg# find . -name "*.txt" -type f | xargs -o ls -la
ls: ./hello: No such file or directory
ls: world.txt: No such file or directory
zg# find . -name "*.txt" -type f | xargs -0 ls -la
ls: ./hello world.txt
: No such file or directory
zg#
Гость писал(а):нет чтобы использовать -exec
ну, тут ясно дело будет работать

Код: Выделить всё

zg# find . -name "*.txt" -type f -exec ls -la \{\} \;
-rw-r--r--  1 root  wheel  0  5 июн 08:10 ./hello world.txt
zg#
Гость писал(а):люди придумывают велосипеды с xagrgs...
как бэ список может получиться не только с помощью find :pardon: а ещё нпаример с условием по грепу или из вывода ls.

Если уж пробелы надо исключить, то

Код: Выделить всё

zg# find . -name "*.txt" | xargs -I % ls -lah "%"
-rw-r--r--  1 root  wheel     0B  5 июн 08:10 ./hello world.txt
zg#

Гость
проходил мимо

Re: Поиск и Удаление файлов

Непрочитанное сообщение Гость » 2009-06-05 9:13:19

zg писал(а):Если уж пробелы надо исключить, то

Код: Выделить всё

zg# find . -name "*.txt" | xargs -I % ls -lah "%"
-rw-r--r--  1 root  wheel     0B  5 июн 08:10 ./hello world.txt
zg#
кавычки тоже могут присутствовать в имени. Единственный символ, кой не может присутствовать - NUL. Вот поэтому у find есть опция `-print0', а у xargs `-0'.

ps, NUL можно сгенерировать с помощью "$(echo -e \\0)" (для sh, bash, zsh) внутри скрипта или вставить символ вручную по Ctrl+V Ctrl+Space (или Ctrl+Q Ctrl+Space).

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: Поиск и Удаление файлов

Непрочитанное сообщение zg » 2009-06-05 9:53:14

Гость писал(а):Вот поэтому у find есть опция `-print0', а у xargs `-0'.
гм.. не знал

Код: Выделить всё

zg# find . -name "Привет*" -print0 | xargs -0 ls -la
-rw-r--r--  1 root  wheel  0 28 янв 11:25 ./Привет мир!
-rw-r--r--  1 root  wheel  0  6 май 18:13 ./Привет_мир.txt
zg#
и правда пашет :smile: буду знать, сенкс -)))

fanbass
мл. сержант
Сообщения: 70
Зарегистрирован: 2009-03-26 11:07:26
Откуда: Санкт-Петербург
Контактная информация:

Re: Поиск и Удаление файлов

Непрочитанное сообщение fanbass » 2009-06-22 17:02:45

Гость писал(а):только если использовать xargs без `-0', то на файле/папке с пробелом в имени могут появится аномалии вплоть до `rm -rf /' ;)
нет чтобы использовать -exec люди придумывают велосипеды с xagrgs...
Нашёл пару статеек по поводу -exec
http://house.hcn-strela.ru/BSDCert/BSDA ... 07s06.html
http://linux.yaroslavl.ru/docs/conf/find_2.html
где не особо-то рекомендуют использовать -exec
И ещё интересный момент. Согласно:
http://freebsd.org.ua/man/find.1.html
-delete
Удалить найденные файлы и/или каталоги. Всегда истинен. Испол-
няется из текущего рабочего каталога, по мере рекурсивного про-
хода find вниз по дереву. Исходя из соображений безопасности,
find не будет пытаться удалять файлы с символом ``/'' в пути
относительно ``.''. Эта опция подразумевает обход сначала в глу-
бину.
Т.е. я был немного не прав
fanbass писал(а): нельзя удалить файлы и директории содержащие символы "/", "_", "-"...? Для какой-то там защиты.
Речь в man-е идёт только о символе ``/''.
Соответственно, файлы содержащие в своём имени все остальные знаки должны находиться и удаляться с помощью команды:

Код: Выделить всё

find / -name "fr_FR" -delete
Вобщем, где-то в этой команде, явно зарылся баг!

Гость
проходил мимо

Re: Поиск и Удаление файлов

Непрочитанное сообщение Гость » 2009-06-23 1:40:01

fanbass писал(а):Нашёл пару статеек по поводу -exec
почему обязательно читать левые источники? чем так плох find.
BSDA-course@house.hcn-strela.ru писал(а):

Код: Выделить всё

-exec команда [опции [{}]] +
  • Опция есть только в FreeBSD!
Эквивалентна опции -exec ... ;, но замещает {} не одним найденным файлом, а списком файлов. Таким образом, указанная команда вызывается лишь однажды. Это работает как же, как связка с командой xargs(1).
чушь, в linux'е и netbsd есть
http://www.gnu.org/software/findutils/m ... Files.html
http://netbsd.gw.com/cgi-bin/man-cgi?fi ... SD-current
docs@linux.yaroslavl.ru писал(а):Однако, для удаления большого количества файлов, такой способ не является лучшим. Дело в том, что когда вы используете ключ -exec, для каждого найденного файла создается отдельный процесс для выполнения команды -- параметра ключа -exec. Это скорее всего не создаст проблем на вашем домашнем компьютере, где вы собираетесь найти всего несколько файлов, однако если вы попытаетесь таким способом найти и обработать сотни или тысячи файлов на рабочем сервере, то проблемы появятся -- дело в том, что к сожалению этот метод требует наибольшее количество ресурсов и работает медленнее чем все остальные.
Воспользуемся для удаления файлов другим способом:

Код: Выделить всё

find . -name “*.old” -print | xargs rm
хм... "Поиск в UNIX, часть 2 опубликовано 30/09/02". Тогда может быть опция -exec вместе с + и не было в gnu find. А когда-то и find'а не было. Не надо на склеп ориентироваться при написании скриптов, а то потом в привычке будет спать со скелетами в обнимку и укрываться паутиной вместо одеяла.
fanbass писал(а):И ещё интересный момент. Согласно:
http://freebsd.org.ua/man/find.1.html
"переводы из склепа"? там информация часто "не очень" актуальная
fanbass писал(а):

Код: Выделить всё

find / -name "fr_FR" -delete
Вобщем, где-то в этой команде, явно зарылся баг!
А с чего ты взял, что -delete будет удалять непустую директорию?

Код: Выделить всё

find / \( -path "*/fr_FR/*" -or -name "fr_FR" \) -delete
fanbass писал(а):
fanbass писал(а):

Код: Выделить всё

find / -name file -delete
нельзя удалить файлы и директории содержащие символы "/", "_", "-"...? Для какой-то там защиты.
Речь в man-е идёт только о символе ``/''.
вообще-то в мане говорится об относительных путях

Код: Выделить всё

	/* Potentially unsafe - do not accept relative paths whatsoever */
	if (strchr(entry->fts_accpath, '/') != NULL)
		errx(1, "-delete: %s: relative path potentially not safe",
			entry->fts_accpath);
в логе также есть причина почему Peter Wemm добавил эту проверку
Peter Wemm @ cvs-usrbin писал(а): r18681 | peter | 1996-10-04 16:54:07 +0400 (Fri, 04 Oct 1996) | 27 lines

Implement a -delete option to find. The code is extremely paranoid and
goes to a fair degree of trouble to enable something like this to
be safe: cd /tmp && find . -mtime +7 -delete

It removes both files and directories. It does not attempt to remove
immutable files (an earlier version I showed to a few people did a chflags
and tried to blow away even immutable files. Too risky..)

It is thought to be safe because it forces the fts(3) driven descent to
only do "minimal risk" stuff. specifically, -follow is disabled, it does
checking to see that it chdir'ed to the directory it thought it was
going to, it will *not* pass a pathname with a '/' character in it to
unlink(), so it should be totally immune to symlink tree races. If it runs
into something "fishy", it bails out rather than blunder ahead.. It's better
to do that if somebody is trying to compromise security rather than risk
giving them an opportunity. Since the unlink()/rmdir() is being called
from within the current working directory during the tree descent, there
are no fork/exec overheads or races.

As a side effect of this paranoia, you cannot do a
"find /somewhere/dir -delete", as the last argument to rmdir() is
"/somewhere/dir", and the checking won't allow it. Besides, one would use
rm -rf for that case anyway. :-)

Reviewed by: pst (some time ago, but I've removed the immutable file
deletion code that he complained about since he last saw it)
в конце даже описан побочный эффект, когда содержимое удалится, но сама папка нет ;)

Аватара пользователя
RusBiT
лейтенант
Сообщения: 635
Зарегистрирован: 2007-08-03 11:43:53
Откуда: Красноярск
Контактная информация:

Re: Поиск и Удаление файлов

Непрочитанное сообщение RusBiT » 2009-07-25 17:32:30

в find нету ключа который позволит удалить все файлы/папки, созданные не в течении последнего месяца?
А то надоело фтп'шник чистить...

Код: Выделить всё

 find /var/ftp/EXCHANGE/OTHER/ -mtime +31 -print -delete
Эт правильное решения удаления всех файлов, которые были закачены более31 дня назад?
Чем больше я познаю FreeBSD, тем больше я считаю себя ламером :)

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: Поиск и Удаление файлов

Непрочитанное сообщение zg » 2009-07-25 20:52:52

RusBiT писал(а):Эт правильное решения
дак проверь :smile: если список построен правильно, значит всё ок.