Удаление некоторых из самых больших файлов в каталоге

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

Я могу получить имена файлов первой десятки:

ls -S | head ls -S | head (или более богатая, хотя и более сложная для разбора ls -lS | head )

Как я могу передать их rm? через xargs?

Так будет ls -S | head | xargs rm ls -S | head | xargs rm ls -S | head | xargs rm работает (даже с именами файлов с пробелами и т. д.?)

Есть ли лучший / безопасный способ?

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

Я использую macOS.

  • Как я могу объединить все файлы в каталоге вместе в одной операции с командной строкой?
  • Необходимо отформатировать 5 дисков параллельно
  • Объединить аргумент xargs с некоторым текстом
  • xargs, записи и стандартный ввод
  • Как выполнить команду несколько раз с разными аргументами?
  • Объединение bash% с xargs%
  • Как создать бесконечный поток строк в bash
  • вывод искажается при параллельном запуске «xargs ls»
  • 5 Solutions collect form web for “Удаление некоторых из самых больших файлов в каталоге”

    Так будет ls -S | head | xargs rm ls -S | head | xargs rm ls -S | head | xargs rm работает (даже с именами файлов с пробелами и т. д.?)

    Неа. xargs по умолчанию разбивается на любые пробелы, а не только на символы новой строки. И вы не можете видеть, что с | xargs echo | xargs echo , поскольку echo выводит все его аргументы, разделенные пробелами. (Что-то вроде | xargs printf "%s\n" будет печатать их, разделенные символами новой строки, поэтому вы увидите, происходит ли разделение в середине имени файла.)

    По крайней мере, GNU xargs имеет -d '\n' для разделения только на строки новой строки, а во многих версиях xargs есть -0 для разделения на NUL-символы (он идет с find -print0 ). Вам нужно будет, по крайней мере, первое, но в общем случае имена файлов также могут содержать символы новой строки, и в этом случае head тоже не принесет ничего хорошего.

    Я обязан предупредить вас, что анализ вывода ls считается неправильным , по-видимому, по крайней мере некоторые версии будут приводить в действие вывод даже без наличия новых строк. (Возможно, вы можете быть в безопасности, если у вас нет символов новой строки или непечатаемых символов. Возможно.)

    Я бы использовал другой подход. Что-то вроде этого:

     size=20000 # set a limit (in bytes), above these we will delete for file in * do [[ -f "$file" ]] || continue fileSize=$(stat --format "%s" "$file") if (( $fileSize > $size )) # if file is bigger than 20000 bytes then rm "$file" # delete the file fi done 

    Таким образом, вы сможете удалять файлы с пробелами в них и можете решить с переменной $size какие файлы на самом деле «большие». Если вы хотите получить запрос перед каждым удалением, используйте ключ -i : rm -i

    Редактировать:
    Я только сейчас понял, что вы используете это под OS X. У меня нет доступа к какой-либо машине с OS X на данный момент, может быть, риск, что OS X stat имеет другой формат для получения размера. Другими словами, параметр --format "%s" может не работать. Проверьте man stat в OS X!

    я бы пошел;

     find . -type f -size +10M -delete -print 

    Если вы действительно хотите пойти с ls способом, возможно;

     ls -S | head -1 | while read af; do rm "$af"; done 

    Он будет работать, но необходимо помнить следующее:

    • Здесь rm не собирается спрашивать вас, хотите ли вы действительно удалить файл.
    • Это не приведет к удалению файлов, содержащих пробелы в их имени.

    Используйте zsh . Он имеет метод сортировки и выбора файлов по размеру (и по дате, который используется чаще). Zsh является частью стандартной установки на OSX / macOS, но может потребоваться установка отдельно в других вариантах Unix.

    Способ выбора (и сортировки) файлов с использованием критериев, отличных от имени, – это квалификаторы glob . Например, чтобы перечислить 10 самых больших файлов в каталоге, используйте OL для сортировки, уменьшая размер ( l ength) и [1,10] чтобы перечислить первые 10:

     ls -ldU *(OL[1,10]) 

    Выполнение этого без zsh более сложно, особенно если вам нужно справиться с именами файлов, содержащими специальные символы. Пока имена файлов не содержат непечатаемых символов или символов новой строки, вы можете проанализировать вывод ls .

     ls -S | head -n 10 | while read -r filename; do echo rm -- "$filename"; done 
    Interesting Posts

    Могу ли я автоматизировать SFTP для загрузки всего дерева?

    Как интерполировать $ {: – = cat} в строке с двумя кавычками?

    troff для преобразования PDF

    Как я могу запустить Java в ядре Arch Linux ядра grsec-hardend с помощью paxd?

    Parallels на Mac – больше не может работать в Ubuntu

    Есть ли способ установить сетевой прокси в системе?

    Как смонтировать раздел XFS через / etc / fstab, а пользователи без полномочий root могут использовать r / w?

    Почему «ps -p proc1 proc2 proc3» показывает «-csh», «-tcsh» и «- / bin / tcsh», тогда как «ps -p proc » индивидуально все говорят «tcsh»?

    Systemd с поддержкой tmpfs | Как указать размер / tmp вручную

    Каково влияние на производительность системы при включении информации об отладке ядра?

    Какой самый быстрый способ получить n-ю строку текстового файла

    Окна xterm не отображаются после vnc

    Как решить схему разделения?

    Мониторинг ввода / вывода программы

    Как нечувствительные к регистру файловые системы отображают имена файлов верхнего и нижнего регистра?

    Linux и Unix - лучшая ОС в мире.