Ваша команда тоже работает, нужно добавить к ней *
или +
:
$ 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
Если вы используете инструменты 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 удалит только пять самых больших файлов, найденных при поиске во всех каталогах. то есть пять на каталог против пяти всего.
Здесь у вас есть (интенсивный )цикл подоболочки для каждого файла. Замените echo
вашей командой rm:
du -Sh /your/search/path/ |\
sort -rh |\
head -5 |\
awk '{print $2}' |\
while read file ; do
echo "$file"
done
Работает в acutal bash. Но это не что иное, как хороший сценарий. И я уверен, что заработаю несколько комментариев из-за пробелов внутри имен файлов. ; )Добро пожаловать!
Если вы знакомы с заданиями cron, периодически выполняйте этот скрипт.
С последними инструментами 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
для обратной -сортировки по длине (размеру, а не по использованию диска )).
Вот простой ответ, который, надеюсь, поможет вам -'find / -type f -size 1G -exec rm {} \;' Это найдет любой файл под корнем, который является файлом, а не каталогом, размером более 1 ГБ, и удалит его. Вы можете добавить дополнительную сортировку файлов после exec, если вам нужно, например, выбрать файл по имени. Размер можно изменить на M (мегабайт ), k (килобайт ), c (байт ). Есть много опций, которые можно найти, и это мощная команда, загляните на справочную страницу!:)