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

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

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

  • Извлечение значений из файла с помощью нескольких ключей
  • Как я могу увидеть историческое время изменения файла?
  • Как найти удобочитаемую информацию о типах файлов, распознанных `file`?
  • Командная строка только ОС UNIX / Linux
  • В чем цель `rm -P`?
  • Необходимо перенести последнюю строку файла во вторую строку того же файла
  • 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.

  • Понимание следующей команды find
  • Почему не находит. -delete удалить текущий каталог?
  • Прокрутка по строке в терминале, а не по странице Shift + PgUp
  • Переместить позицию окна приложения из командной строки в OSX
  • Как отобразить имя драйвера звуковой карты из командной строки в Lubuntu 11.10?
  • Команды, чтобы узнать о незнакомой системе
  • 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 
    Linux и Unix - лучшая ОС в мире.