Страница 1 из 1

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

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

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

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

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

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

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

Добавлено: 2009-05-26 16:17:46
Mox
все вроде правильно, должен удалять. может прав не хватает.
оболочка непричем

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

Добавлено: 2009-05-26 18:45:56
ronin
В скрипте все верно вы указали. Вопрос топикостартеру. Из под кого запускаете скрипт?

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

Добавлено: 2009-05-27 8:11:06
zg
fanbass писал(а):- выводит кучу файлов, которые я хтелбы удалить.
дак добавь конвеер-удалялку

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

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

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

Добавлено: 2009-05-27 10:19:32
fanbass
Попытка поиска и удаления производилась из под root.
zg писал(а):... дак добавь конвеер-удалялку

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

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

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

Добавлено: 2009-05-27 10:32:05
zg
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#
но это крайне небезопасный вариант

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

Добавлено: 2009-05-27 11:52:22
fanbass
zg
У тебя какая версия FreeBSD?
Кстате ты ищеш конкретный файл, а я ищю все файлы и директории fr_FR.
Вот что получается у меня Работая под root (см. вложения)
zg писал(а):оно и работает, просто либо у тебя прав не хватает, либо не так запускаешь
Как видим ничего удаляться ни желает :(
Что там может быть не так?

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

Добавлено: 2009-05-27 11:55:57
terminus

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

find / -name "fr_FR*" -exec chflags -R 0 {} \;
find / -name "fr_FR*" -delete

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

Добавлено: 2009-05-27 12:11:54
fanbass
terminus писал(а):

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

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

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

Добавлено: 2009-05-27 12:21:03
terminus
"Неудаляемые рутом" файлы это те, на которых стоят флаги (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/

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

Добавлено: 2009-05-29 11:37:03
fanbass
Про флаги я и забыл. Но опять-же 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
Не работает!!!
Вобщем вопрос открыт...

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

Добавлено: 2009-05-29 12:39:10
zg
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.

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

Добавлено: 2009-05-29 13:42:08
fanbass
Я в английском не особо силён. Если я правельно понял, то с помощью:

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

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

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

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

Добавлено: 2009-05-29 14:58:26
zg
fanbass писал(а):В чём опасность?
это всё равно, что

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

rm -rf /**

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

Добавлено: 2009-05-29 15:42:03
fanbass
zg писал(а):это всё равно, что

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

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

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

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

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

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

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

Добавлено: 2009-06-05 6:15:22
zg
Гость писал(а):только если использовать 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).

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

Добавлено: 2009-06-05 9:53:14
zg
Гость писал(а):Вот поэтому у 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: буду знать, сенкс -)))

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

Добавлено: 2009-06-22 17:02:45
fanbass
Гость писал(а):только если использовать 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)
в конце даже описан побочный эффект, когда содержимое удалится, но сама папка нет ;)

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

Добавлено: 2009-07-25 17:32:30
RusBiT
в find нету ключа который позволит удалить все файлы/папки, созданные не в течении последнего месяца?
А то надоело фтп'шник чистить...

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

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

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

Добавлено: 2009-07-25 20:52:52
zg
RusBiT писал(а):Эт правильное решения
дак проверь :smile: если список построен правильно, значит всё ок.