С помощью zsh
:
cd /some/specific/folder && echo rm -rf -- *(/n[1,-4])
Удалите все папки, кроме трех последних (/
) в числовом (n
) порядке сортировки (где subfolder10
сортирует после subfolder2
), исключая скрытые.
Удалите echo
для фактического выполнения операции.
Обратите внимание, что время создания не записывается во многих системах, а когда оно записывается (как в последних версиях Linux), его нелегко получить. Все, на что вы можете положиться, это время последней модификации (дата, показанная в ls -l
).
Чтобы удалить все, кроме трех последних модифицированных, все еще с помощью zsh
:
cd /some/specific/folder && echo rm -rf -- *(/Om[1,-4])
Om
обратный порядок по времени модификации (от самого старого к самому новому, как ls -tr
).
Если у вас нет или нет возможности установить zsh
, но вы работаете на последней системе GNU, вместо этого можно сделать следующее:
(export LC_ALL=C
cd /some/specific/folder &&
find . ! -name . -prune -type d ! -name '.*' -printf '%T@\t%f\0' |
sort -rnz |
tail -zn +4 |
cut -zf 2- |
xargs -r0 echo rm -rf --)
Для менее новых систем GNU (-z
только недавно был добавлен к некоторым из этих утилит):
(export LC_ALL=C
cd /some/specific/folder &&
find . ! -name . -prune -type d ! -name '.*' -printf '%T@\t%f\0' |
tr '\n\0' '\0\n' |
sort -rn |
tail -n +4 |
cut -f 2- |
tr '\0\n' '\n\0' |
xargs -r0 echo rm -rf --)
Если ни одно из имен файлов в каталоге не содержит новых строк, пробелов, кавычек или обратных слешей, вы также можете сделать:
cd /some/specific/folder &&
ls -pt | grep '/$' | tail -n +4 | xargs echo rm -rf --
Для числовой сортировки, подобной zsh
's *(n)
, см. также опцию GNU ls
-v
.
Ошибки тут же:
=: cannot open `=' (No such file or directory)
Что-то пытается открыть файл с именем =
, но он не существует.
/tmp/script.sh: line 9: : No such file or directory
Обычно это имя файла перед последним двоеточием, но, поскольку оно пустое, кажется, что что-то пытается открыть файл с пустым именем.
Рассмотрим строку:
file = "/tmp/countries.properties"
Она запускает команду file
с аргументами =
и /tmp/countries.properties
. (Оболочке безразличны аргументы команды, может быть что-то, что использует знак равенства в качестве аргумента.) Итак, файл
оказывается программой, используемой для определение типов файлов , и он это делает. Сначала вы пытаетесь открыть =
, что приводит к ошибке, а затем открываете /tmp/countries.properties
, сообщая вам, что это такое:
/tmp/countries.properties: ASCII text
Другой Нет такого файла или каталог
поступает из перенаправления <$ file
. Поскольку переменной не присвоено значение, перенаправление работать не будет.
Присваивание в оболочке требует, чтобы вокруг знака =
не было пробелов , поэтому:
file=/tmp/countries.properties
Также здесь:
sed -ie 's/:iso=>"${key}"/:iso=>"${key}",:alpha_iso=>"${value}"/g'
Переменные не раскрываются внутри одного кавычки, и у вас есть вокруг всего второго аргумента, поэтому sed
получит буквальный $ {key}
, а не содержимое переменной.
Либо закройте одинарные кавычки, чтобы раскрыть переменные, либо просто используйте двойные кавычки для всей строки:
sed -ie 's/:iso=>"'${key}'"/:iso=>"'${key}'",:alpha_iso=>"'${value}'"/g'
sed -ie "s/:iso=>\"${key}\"/:iso=>\"${key}\",:alpha_iso=>\"${value}\"/g"