Linux как удалить файл по списку

bash. удаление файлов по списку из файла.

интересует, каким образом можно удалить файлы имея их список в файле?

вариант с построчным чтением и выполнением rm не предлагать, он ацки долгий.

cat list | xargs rm -rv

А если my.txt четырёх гигов размером?

если список длинный, rm ругнется и не удалит.

ну.. список не будет более мегабайта, полагаю.

всем благодарен. вопрос закрыт.

О, знаток шелла? Попытка обойти граничные случаи?
Представь что публики нет, играть ни на кого не надо: будь честен хотя бы с самим собой и перечисли сам случаи, когда твой вариант не будет работать

Идеальный вариант в студию, будь добр

cat file | while read

А, ну да, пробелы не эксейпятся, если ты об этом

так это ты решил просвещением заняться, и про гигабайты начал страшилки рассказывать, я и не претендовал на универсальность

ТС не устраивает вариант с построчным чтением. А как известно клиент всегда прав

При достаточно большом списке это будет неизбежно. А так — да, получается дольше.

Кстати, в твоём случае пробелы тоже не ескейпятся, так что окромя этого я пока не вижу косяков.

А вообще я не понял, что ты от меня хочешь, покойся с миром.

в своё время, решал эту проблему простым копированием этого файла с редактированием строчек так, чтобы они превращались в параметры для rm, а затем весь файл запускал как скрипт

От тебя, и от остальных 6 миллиардов мне хотелось бы простого, но невыполнимого — адекватности.
Ты сам начал игру «А если. », я её поддержал, ты слился, т.е. я тебя сделал в твоей же собственной игре, ну куда это годится?
Я надеялся на выходе будет интересное красивое решение, а оказалась скукотища.
Больше с тобой не играем, и при встрече делаем вид, что мы не знакомы

Я от тебя конструктив то услышу? На косяк твоего $() тебе уже не только я указал

для 4гигабайт есть split -l

Не сдаёшься? Респект от Снупа
Для каждой задачи есть свой инструмент.
Не бывает универсальных инструментов, это ты и сам уже понял, и признал. Молодец.
Осталось научить тебя вежливости, и станешь на человека похож.
А твои аргументы из серии
«А знаешь какой у твоего туловища косяк?
У него всего две руки.
Было бы шесть — мог бы печатать в 3 раза быстрее» конечно умиляют, пойду твои остальные каменты почитаю повнимательнее

Смешно от тебя слышать что-то про адекватность, честно

Источник

Как удалить файлы и каталоги с помощью командной строки Linux

В этом руководстве мы покажем вам, как использовать команды rm , unlink и rmdir для удаления файлов и каталогов в Linux.

Читайте также:  Метроном для mac os

Как удалить файлы

Чтобы удалить (или удалить) файл в Linux из командной строки, используйте команду rm (remove) или unlink .

Команда unlink позволяет удалить только один файл, а с помощью rm вы можете удалить сразу несколько файлов.

Будьте особенно осторожны при удалении файлов или каталогов, потому что после удаления файла его будет нелегко восстановить.

Чтобы удалить один файл, используйте команду rm или unlink за которой следует имя файла:

Если файл защищен от записи, вам будет предложено подтвердить, как показано ниже. Чтобы удалить тип файла y и нажмите Enter . В противном случае, если файл не защищен от записи, он будет удален без запроса.

Чтобы удалить сразу несколько файлов, используйте команду rm после которой укажите имена файлов, разделенные пробелом.

Вы также можете использовать подстановочный знак ( * ) и обычные расширения для соответствия нескольким файлам. Например, чтобы удалить все файлы .pdf в текущем каталоге, используйте следующую команду:

При использовании обычных расширений сначала перечислите файлы с помощью команды ls чтобы вы могли видеть, какие файлы будут удалены, прежде чем запускать команду rm .

Используйте rm с параметром -i для подтверждения каждого файла перед его удалением:

Чтобы удалить файлы без запроса, даже если файлы защищены от записи, передайте параметр -f (force) команде rm :

Вы также можете комбинировать параметры rm . Например, чтобы удалить все файлы .txt в текущем каталоге без запроса в подробном режиме, используйте следующую команду:

Как удалить каталоги (папки)

В Linux вы можете удалять / удалять каталоги с помощью rmdir и rm .

rmdir — это утилита командной строки для удаления пустых каталогов, а с помощью rm вы можете рекурсивно удалять каталоги и их содержимое.

Чтобы удалить пустой каталог, используйте rmdir или rm -d за которым следует имя каталога:

Чтобы удалить непустые каталоги и все файлы в них, используйте команду rm с параметром -r (рекурсивный):

Если каталог или файл в каталоге защищен от записи, вам будет предложено подтвердить удаление.

Чтобы удалить непустые каталоги и все файлы без запроса, используйте rm с параметрами -r (рекурсивный) и -f :

Чтобы удалить сразу несколько каталогов, используйте команду rm -r после которой укажите имена каталогов, разделенные пробелом.

Как и в случае с файлами, вы также можете использовать подстановочный знак ( * ) и обычные расширения для соответствия нескольким каталогам.

Выводы

К настоящему времени вы должны хорошо понимать, как использовать команды Linux rm , rmdir и unlink и у вас должна быть возможность безопасно удалять файлы и каталоги из командной строки.

Источник

Bash. Удаление файлов по списку, в названии которых есть пробелы

Есть похожие темы на форуме, почитал. Сел на линь недавно, куски из разных тем не могу собрать воедино, хотя думаю это элементарно. Задача проста: есть список list.txt, в нём строки такого типа:

  • /files/file.txt
  • /files/file2.txt
  • /files/file3.txt
  • /files/new file.doc
  • /files/new file2.doc

Названия и расширения файлов могут быть разными, главное что в именах присутствуют пробелы!
Команды

tr ‘\n’ ‘\0’ | xargs -0 rm -f

sed -n ‘s/.*/rm «&»/e’ /list/list.txt

Работает. Отлично. Благодарю великодушно )). затевалось для openwrt. Пойду теперь почитаю про кодировки, т. к. названия с кириллицей не удаляются.

Читайте также:  Mac os 2020 как установить

Благодари ArcFi , я только вызов cat выкинул.

На openwrt должен быть sed вроде. Можно попробовать мой первый вариант, sed умеет в местную кодировку обычно, раз с read проблемы. Хотя странно.

возможно без find -inum не обойтись

почему то sed’а нет на openwrt, и пакетов в доступе не вижу.

Ну ок, он так-то и не для этого предназначен.

Так то задача решена что описана в топике, а костыль для кириллицы я какой нибудь прикручу потом. Большое спасибо всем участникам.

если файл небольшой то можно попробовать и так:

(подпроцесс дабы не сохранять и восстанавливать IFS)

а так лучше, конечно, xargs -0, если поддерживается

Пойду теперь почитаю про кодировки, т. к. названия с кириллицей не удаляются.

В файле сконвертируй названия в ту кодировку, в которой у тебя имена файлов. Скорее всего тебе надо utf-8

и прощай список, ага

Пойду теперь почитаю про кодировки, т. к. названия с кириллицей не удаляются.

В файле сконвертируй названия в ту кодировку, в которой у тебя имена файлов. Скорее всего тебе надо utf-8

Ананимас ты прав, я тупанул. Это в винде for построчно читает файлы. С ним как-то не получается здесь. Зато выяснил в чем разница между while read и for in. В первом случае можно читать строки целиком а во втором можно токены в цикле крутить. Сегодня не мой день. Хотя мой. Просто тред не мой ^_^

подпроцесс дабы не сохранять и восстанавливать IFS

Должно быть достаточно после действия сделать unset IFS

Источник

Так как же удалить миллионы файлов из одной папки?


Феерическая расстановка точек над i в вопросе удаления файлов из переполненной директории.

Прочитал статью Необычное переполнение жесткого диска или как удалить миллионы файлов из одной папки и очень удивился. Неужели в стандартном инструментарии Linux нет простых средств для работы с переполненными директориями и необходимо прибегать к столь низкоуровневым способам, как вызов getdents() напрямую.

Для тех, кто не в курсе проблемы, краткое описание: если вы случайно создали в одной директории огромное количество файлов без иерархии — т.е. от 5 млн файлов, лежащих в одной единственной плоской директории, то быстро удалить их не получится. Кроме того, не все утилиты в linux могут это сделать в принципе — либо будут сильно нагружать процессор/HDD, либо займут очень много памяти.

Так что я выделил время, организовал тестовый полигон и попробовал различные средства, как предложенные в комментариях, так и найденные в различных статьях и свои собственные.

Подготовка

Так как создавать переполненную директорию на своём HDD рабочего компьютера, потом мучиться с её удалением ну никак не хочется, создадим виртуальную ФС в отдельном файле и примонтируем её через loop-устройство. К счастью, в Linux с этим всё просто.

Создаём пустой файл размером 200Гб

Многие советуют использовать для этого утилиту dd, например dd if=/dev/zero of=disk-image bs=1M count=1M , но это работает несравнимо медленнее, а результат, как я понимаю, одинаковый.

Форматируем файл в ext4 и монтируем его как файловую систему

К сожалению, я узнал об опции -N команды mkfs.ext4 уже после экспериментов. Она позволяет увеличить лимит на количество inode на FS, не увеличивая размер файла образа. Но, с другой стороны, стандартные настройки — ближе к реальным условиям.

Создаем множество пустых файлов (будет работать несколько часов)

Кстати, если в начале файлы создавались достаточно быстро, то последующие добавлялись всё медленнее и медленнее, появлялись рандомные паузы, росло использование памяти ядром. Так что хранение большого числа файлов в плоской директории само по себе плохая идея.

Проверяем, что все айноды на ФС исчерпаны.

Читайте также:  Telnet mac os terminal

Размер файла директории

Теперь попробуем удалить эту директорию со всем её содержимым различными способами.

Тесты

После каждого теста сбрасываем кеш файловой системы
sudo sh -c ‘sync && echo 1 > /proc/sys/vm/drop_caches’
для того чтобы не занять быстро всю память и сравнивать скорость удаления в одинаковых условиях.

Удаление через rm -r

$ rm -r /mnt/test_dir/
Под strace несколько раз подряд (. ) вызывает getdents() , затем очень много вызывает unlinkat() и так в цикле. Занял 30Мб RAM, не растет.
Удаляет содержимое успешно.

Т.е. удалять переполненные директории с помощью rm -r /путь/до/директории вполне нормально.

Удаление через rm ./*

$ rm /mnt/test_dir/*
Запускает дочерний процесс шелла, который дорос до 600Мб, прибил по ^C . Ничего не удалил.
Очевидно, что glob по звёздочке обрабатывается самим шеллом, накапливается в памяти и передается команде rm после того как считается директория целиком.

Удаление через find -exec

$ find /mnt/test_dir/ -type f -exec rm -v <> \;
Под strace вызывает только getdents() . процесс find вырос до 600Мб, прибил по ^C . Ничего не удалил.
find действует так же, как и * в шелле — сперва строит полный список в памяти.

Удаление через find -delete

$ find /mnt/test_dir/ -type f -delete
Вырос до 600Мб, прибил по ^C . Ничего не удалил.
Аналогично предыдущей команде. И это крайне удивительно! На эту команду я возлагал надежду изначально.

Удаление через ls -f и xargs

$ cd /mnt/test_dir/ ; ls -f . | xargs -n 100 rm
параметр -f говорит, что не нужно сортировать список файлов.
Создает такую иерархию процессов:

ls -f в данной ситуации ведет себя адекватнее, чем find и не накапливает список файлов в памяти без необходимости. ls без параметров (как и find ) — считывает список файлов в память целиком. Очевидно, для сортировки. Но этот способ плох тем, что постоянно вызывает rm , чем создается дополнительный оверхед.
Из этого вытекает ещё один способ — можно вывод ls -f перенаправить в файл и затем удалить содержимое директории по этому списку.

Удаление через perl readdir

$ perl -e ‘chdir «/mnt/test_dir/» or die; opendir D, «.»; while ($n = readdir D) < unlink $n >‘ (взял здесь)
Под strace один раз вызывает getdents() , потом много раз unlink() и так в цикле. Занял 380Кб памяти, не растет.
Удаляет успешно.

Получается, что использование readdir вполне возможно?

$ gcc -o cleandir cleandir.c
$ ./cleandir
Под strace один раз вызывает getdents() , потом много раз unlink() и так в цикле. Занял 128Кб памяти, не растет.
Удаляет успешно.

Опять — же, убеждаемся, что использовать readdir — вполне нормально, если не накапливать результаты в памяти, а удалять файлы сразу.

Источник

Оцените статью