Каков наилучший способ удалить все файлы в текущем каталоге с некоторым префиксом, кроме файла с этим префиксом, но имеющего наибольший размер среди всех файлов с этим префиксом?
(В случае, если самый большой из них не уникален, просто случайным образом оставьте один из них и удалите остальные.)
Например, текущий каталог содержит следующие файлы:
-rw-rw---- 1 user user 3468 Jan 01 00:00 filea
-rw-rw---- 1 user user 3434 Jan 01 00:00 pre_0
-rw-rw-r-- 1 user user 9769 Jan 01 00:00 fileb
-rw-rw-r-- 1 user user 1950 Jan 01 00:00 filec
-rw-rw-r-- 1 user user 8654 Jan 01 00:00 pre_1
-rw-rw---- 1 user user 6508 Jan 01 00:00 pre_2
После запуска команды или сценария для удаления всех файлов с префиксом «pre_», кроме самого большого, текущий каталог должен быть указан как:
-rw-rw---- 1 user user 3468 Jan 01 00:00 filea
-rw-rw-r-- 1 user user 9769 Jan 01 00:00 fileb
-rw-rw-r-- 1 user user 1950 Jan 01 00:00 filec
-rw-rw-r-- 1 user user 8654 Jan 01 00:00 pre_1
command-line
files
wildcards
Д. Чен
источник
источник
Ответы:
Вы можете использовать комбинацию из нескольких утилит:
Предполагая систему GNU и никаких необычных имен файлов.
stat
получает размер файла и имя, разделенное пробелом для всехpre_*
файловsort
сортирует файл по размеру файла, при этом самый высокий размер идет вверхtail -n +2
получает остальные файлы отдельно от максимального размераcut -d' ' -f2
получает только имя файла, аrm
(xargs rm
) выполняет удалениеисточник
cut
. По крайней мере, эта стадия может быть исправлена, еслиcut
вызов заменен наsed 's@^[^ ]\+ @@'
. Не уверен, чтоxargs
будет работать правильно.stat
стадии тогда, поэтому я не упомянул необычные имена файловstat
не может отправить вывод, как NUL отделены, вот почему ..С
zsh
:OL
: обратный порядок по размеру[2,-1]
только второйЭквивалент
bash
утилиты with и GNU будет выглядеть примерно так:Возможно, вы захотите ограничить его обычными файлами, поскольку размер нестандартных файлов обычно не имеет большого значения:
(нет прямого bash + GNU эквивалент). Вы можете захотеть включить символические ссылки в обычные файлы и рассмотреть размер цели символических ссылок:
С помощью
ls
добавьте-L
опцию, чтобы рассмотреть размер целей символических ссылок.источник
zsh
... Я до сих пор не научился этому. Также не нашли хорошей отправной точки.