LINUX.ORG.RU
ФорумAdmin

Удалить разом несколько файлов

 , ,


1

1

Здравствуйте! Есть каталог, /opt/sof/bd/. В bd находится очень много файлов, требуется одним разом удалить все файлы с разрешением .txt и файлы в которых есть имя «abc» (abc01,abc02,abc03 и т.д.)

Здесь порылся нашел, что такое можно реализовать через команду find.

find /opt/sof/bd/ -name *.txt -mtime +30 -print0 | xargs -0 rm -f
и соответственно
find /opt/sof/bd/ -name abc.* -mtime +30 -print0 | xargs -0 rm -f
Но почему-то не работает..Кто поправит, в чем ошибка? Хотелось бы написать простенький скрипт. В ручную не вариант удалять, файлов больше 1000

Ответ на: комментарий от anto215

rm -f /opt/sof/bd/abc* /opt/sof/bd/*.txt

Это развернёт шелл, в строку оно не влезет и пошлёт в задницу.

r3lgar ★★★★★ ()

-name *.txt

-name abc.*

Оберни в кавычки, ибо * разворачивает шелл, и разворачивает скорее всего в ничего.

abc01,abc02,abc03

abc*, а не abc.*.

требуется одним разом удалить все файлы с разрешением .txt и файлы в которых есть имя «abc» (abc01,abc02,abc03 и т.д.)

-name '*abc*.txt'

все файлы

-type f
r3lgar ★★★★★ ()
Последнее исправление: r3lgar (всего исправлений: 3)
find /path -name "*.txt" -o -name "*abc*" -exec rm {} \;
darktic ★★ ()

про экранирование шаблонов уже подсказали

"-delete" в find чем не подходит ?

vel ★★★★★ ()
Ответ на: комментарий от vel

Эм, даже не в курсе)) Просто понадобилось вот удалить из базы, N-ое количество файлов))

Rayman24 ()
Ответ на: комментарий от MyTrooName

А если нужно не удалить? А перенести, допустим «*.txt» в другой каталог?

Rayman24 ()

Если надо не переносить, а именно удалять, у find есть даже специальный ключик для этого, -delete. Пожалуйста, посмотрите в эту сторону, т.к. при этом нагрузка меньше на систему, меньше процессов создается и тратится меньше памяти.

Infra_HDC ★★★★★ ()
Ответ на: комментарий от r3lgar

Тебя он пошлет в задницу.

[ test]$ ls |head
abc1
abc10
abc100
abc1000
abc101
abc102
abc103
abc104
abc105
abc106
[ test]$ ls abc* |wc -l
1000
[ test]$ time rm -f abc*

real	0m0,090s
user	0m0,005s
sys	0m0,039s
[ test]$ ls abc* |wc -l
ls: невозможно получить доступ к 'abc*': Нет такого файла или каталога
0
[ test]$ 
anto215 ★★ ()
Ответ на: комментарий от Dispetcher14

разворот *.txt в набор файлов очень долгое и гиблое дело. может памяти не хватить.

чистил архивы тайловых карт ~300 000 файлов в куче вложенных директорий общим весом под сотню гигов.

кстати до сих пор не понимаю почему все так упираются в мудрености "-exec rm {} \;" и "-print0 | xargs -0 rm -f" когда в самом find есть отличная опция

ACTIONS
  -delete
     Delete files; true if removal succeeded.  If the removal failed,
     an  error message is issued.  If -delete fails, find's exit sta‐
     tus will be nonzero (when it eventually exits).  Use of  -delete
     automatically turns on the `-depth' option.

     Warnings:  Don't  forget that the find command line is evaluated
     as an expression, so putting -delete first will make find try to
     delete everything below the starting points you specified.  When
     testing a find command line that you later intend  to  use  with
     -delete,  you should explicitly specify -depth in order to avoid
     later surprises.  Because -delete  implies  -depth,  you  cannot
     usefully use -prune and -delete together.

pfg ★★★★ ()
find /path/to/dir -name "*.txt" -o -name "abc*" -delete
mexx ()

нафиг файнд для одного каталога?
cd /opt/sof/bd/
rm *abc*.txt
rm *.txt*
rm *abc*

darkenshvein ★★★★★ ()
Последнее исправление: darkenshvein (всего исправлений: 1)
Ответ на: комментарий от Rayman24

Ничего не удаляет!

Так не бывает )

Но вообще у меня /opt root:root То есть:

sudo find /opt/sof/bd -name "*.txt" -o -name "abc*" -delete

mexx ()
Ответ на: комментарий от pfg

кстати до сих пор не понимаю почему все так упираются в мудрености "-exec rm {} \;" и "-print0 | xargs -0 rm -f" когда в самом find есть отличная опция -delete

Потому что в posix find нет -delete, но есть зато вместо точки с запятой плюсик, то есть запустит одной командой столько сколько возможно аргументов.

vodz ★★★★★ ()
Ответ на: комментарий от vodz

Потому что в posix find нет -delete, но есть зато вместо точки с запятой плюсик, то есть запустит одной командой столько сколько возможно аргументов.

Осталось лишь найти posix find, которого нет в самых популярных дистрибутивах.

stave ★★★★★ ()
Ответ на: комментарий от stave

Осталось лишь найти posix find, которого нет в самых популярных дистрибутивах.

Очень умно, ага. posix как стандарт определяет минимум, потому он у вас есть в популярных дистрибутивах.

vodz ★★★★★ ()
Ответ на: комментарий от Rayman24

Да, действительно удаляет только последнюю выборку. Был не прав.

Получается надо:

find /opt/sof/bd -name "*.txt" -delete -o -name "abc*" -delete
mexx ()
Ответ на: комментарий от Rayman24

Вот так будет работать:

find -regex '.*\(txt\|abc\).*' -delete
mexx ()
Ответ на: комментарий от vodz

Очень умно, ага. posix как стандарт определяет минимум, потому он у вас есть в популярных дистрибутивах.

И что? В большинстве дистров есть -delete, который работает проще и быстрее. Пользуются таким администраторы, которые явно не делают платформонезависимый софт.

Отсутствие -delete в стандарте лишь говорит о косности последнего.

stave ★★★★★ ()
Ответ на: комментарий от stave

отсутствие фич в станадрте лишь говорит о том что давно не выпускали новых версий стандартов :)

и это стандартнее стандартов :)

pfg ★★★★ ()
Последнее исправление: pfg (всего исправлений: 1)
Ответ на: комментарий от stave

И что?

Да ни чо. Задали вопрос, я — ответил. delete — очень узкая задача, а знание -exec {} + — гораздо полезнее, так как позволяет запустить любую программу с максимальным количеством аргументов на любой posix-, а значить и unix-like системе, и в отличии от -print0 | xargs -0 — «работает проще и быстрее». Потому — знать это полезно, если б pfg этот вариант упомянул того комментария вообще от меня не было.

vodz ★★★★★ ()
Последнее исправление: vodz (всего исправлений: 1)
Ответ на: комментарий от pfg

отсутствие фич в станадрте лишь говорит о том что давно не выпускали новых версий стандартов :)

Я посмотрел, последнее обновление 2017 год. Просто легче нарисовать новую циферку на обложке, чем добавить содержимое.

stave ★★★★★ ()
Ответ на: комментарий от stave

новые функции - новые проблемы (с) любой программист.

так что лучше не надо нового если работает комбинация из старого :) каменный топор исправно служил человечеству на несколько порядков дольше чем все остальные инструменты вместе взятые.

pfg ★★★★ ()
Ответ на: комментарий от pfg

Вот это верно подмечено:) работает не трогай)) Всем спасибо за ответы:)

Rayman24 ()
Ответ на: комментарий от vodz

Осталось выяснить какой find быстрее сделает с -delete или без него.

avb ()
Ответ на: комментарий от avb

exec спавнит детей, логично предположить что быстрее без

anonymous ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.