Как мне прочитать файл свойств с помощью моего скрипта?

С помощью 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.

2
10.03.2017, 02:40
2 ответа

Попробуйте:

file="/tmp/countries.properties"
0
27.01.2020, 21:56

Ошибки тут же:

=:                         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"
7
27.01.2020, 21:56

Теги

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