Найти самые большие файлы и автоматически удалить

Ваша команда тоже работает, нужно добавить к ней * или +:

$ grep -oP 'B.\K[\w\s\d]+' tus.txt | sort -u
00081684
00081907
00082024
00082025
00082403
00082603
222791885833
2239681
262105589241
36
4578873831221

Или, проще говоря:

$ grep -oP 'B\*\K[^*]*' tus.txt | sort -u
00081684
00081907
00082024
00082025
00082403
00082603
222791885833
2239681
262105589241
36
4578873831221

Или используйте awk для вывода предпоследнего *-разделенного поля:

$ awk  -F'[*]' '{print $5}' tus.txt | sort -u
00081684
00081907
00082024
00082025
00082403
00082603
222791885833
2239681
262105589241
36
4578873831221
0
24.07.2017, 15:27
4 ответа

Если вы используете инструменты GNU (, которые являются стандартными для Linux ), вы можете сделать что-то вроде этого:

stat --printf '%s\t%n\0'./* | 
  sort -z -rn | 
  head -z -n 5 | 
  cut  -z -f 2- |
  xargs -0 -r echo rm -f --

(удалите "эхо" после того, как вы протестировали его ).

Команда statвыводит размер файла и имя каждого файла в текущем каталоге, разделенные табуляцией, и каждая запись завершается байтом NUL (\0 ).

Команда sortсортирует каждую запись с завершением NUL -в обратном числовом порядке. Команда headвыводит только первые пять таких записей, затем cutудаляет поле размера файла из каждой записи.

Наконец, xargsпринимает этот (все еще NUL -завершенный )ввод и использует его в качестве аргументов для echo rm -f.

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

Если вам нужен минимальный размер файла, вы можете вставить awkили что-то между statи sort. например.

stat --printf '%s\t%n\0'./* | 
  awk 'BEGIN {ORS = RS = "\0" } ; $1 > 25000000' |
  sort -z -rn |...

ПРИМЕЧАНИЕ. :GNU awkне имеет опции -zдля записей с завершением NUL -, но позволяет вам установить разделитель записей на любое значение, которое вы хотите. Мы должны установить для разделителя выходных записей (ORS )и разделителя входных записей (RS )значение NUL.


Вот еще одна версия, которая использует findдля явного ограничения себя обычными файлами (, т.е. исключая каталоги, именованные каналы, сокеты и т. д. )только в указанном каталоге (-maxdepth 1, без подкаталогов )] размером более 25M (нет необходимости вawk).

Эта версия не нуждается в stat, потому что GNU findтакже имеет функцию printf. Кстати, обратите внимание на разницу в строке формата-statиспользует %nдля имени файла, а findиспользует %p.

find. -maxdepth 1 -type f -size +25M -printf '%s\t%p\0' | 
  sort -z -rn | 
  head -z -n 5 | 
  cut  -z -f 2- |
  xargs -0 -r echo rm -f --

Чтобы запустить его для другого каталога, замените .в команде find. например.find /home/web/....


версия сценария оболочки:

#!/bin/sh

for d in "$@" ; do
  find "$d" -maxdepth 1 -type f -size +25M -printf '%s\t%p\0' | 
    sort -z -rn | 
    head -z -n 5 | 
    cut  -z -f 2- |
    xargs -0 -r echo rm -f --
done

сохраните его как, например, delete-five-largest.shгде-нибудь в вашем PATH и запустите какdelete-five-largest.sh /home/web /another/directory /and/yet/another

Это запускаетfind...один раз для каждого каталога , указанного в командной строке. Это НЕ то же самое, что и однократный запуск findс несколькими аргументами пути (, который будет выглядеть как find "$@"..., без какого-либо forцикла в сценарии ). Он удаляет 5 самых больших файлов в каждом каталоге, а его запуск без цикла for удалит только пять самых больших файлов, найденных при поиске во всех каталогах. то есть пять на каталог против пяти всего.

4
28.01.2020, 02:13

Здесь у вас есть (интенсивный )цикл подоболочки для каждого файла. Замените echoвашей командой rm:

du -Sh /your/search/path/ |\
sort -rh |\
head -5 |\
awk '{print $2}' |\
while read file ; do
  echo "$file"
done

Работает в acutal bash. Но это не что иное, как хороший сценарий. И я уверен, что заработаю несколько комментариев из-за пробелов внутри имен файлов. ; )Добро пожаловать!

Если вы знакомы с заданиями cron, периодически выполняйте этот скрипт.

0
28.01.2020, 02:13

С последними инструментами GNU (вы уже используете определенные параметры GNU -):

du -S0. |sort -zrn | sed -z 's@[^/]*@.@;5q' | xargs -r0 echo rm -rf

(удалить echoесли устраивает ).

-0/ -zпозволяют копировать файлы/каталоги с произвольными именами.

Обратите внимание, что большинство rmреализаций отказываются удалять.(текущий рабочий каталог ), так что вы можете сделать это на один уровень выше и сделать:

du -S0 dir | sort -zrn | sed -z 's@\s*\d+\s*@@;5q' | xargs -r0 echo rm -rf

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

Теперь, если все, что вам нужно, это удалить 5 самых больших обычных файлов (, исключая другие типы файлов, такие как каталоги, устройства, символические ссылки... ), это просто вопрос использования zshи:

echo rm -f./**/*(D.OL[1,5])

(OLдля обратной -сортировки по длине (размеру, а не по использованию диска )).

4
28.01.2020, 02:13

Вот простой ответ, который, надеюсь, поможет вам -'find / -type f -size 1G -exec rm {} \;' Это найдет любой файл под корнем, который является файлом, а не каталогом, размером более 1 ГБ, и удалит его. Вы можете добавить дополнительную сортировку файлов после exec, если вам нужно, например, выбрать файл по имени. Размер можно изменить на M (мегабайт ), k (килобайт ), c (байт ). Есть много опций, которые можно найти, и это мощная команда, загляните на справочную страницу!:)

0
28.01.2020, 02:13

Теги

Похожие вопросы