В сценарии удара, как я передаю переменное целое число 'sed-e' команда (18.04)

Я пытаюсь создать сценарий удара, который повреждает самые старые файлы в каталоге с переменной, устанавливающей сумму файлов для сохранения.

Мой первый шаг должен был считать количество файлов более старым, чем количество набора 10 новейших файлов, которые будут сохранены:

#!/bin/bash
# How many files in the current directory are older than the retained files
olderThanRetain=$(find -maxdepth 1 -type f | sort -r | sed -e '1,10d' | wc -l)
echo $olderThanRetain

Хорошо работает.

Но когда я пытаюсь установить переменную для количества файлов, которые будут сохранены:

#!/bin/bash
retain=10
# How many files in the current directory are older than the retained files
olderThanRetain=$(find -maxdepth 1 -type f | sort -r | sed -e "1,(( $retain ))d" | wc -l)
echo $olderThanRetain

Но это дает мне ошибку:

sed: -e expression #1, char 3: unexpected `,'

Что я пропустил?

1
задан 10 August 2018 в 09:07

1 ответ

Поскольку запятая не является специальным символом в bash нет потребности заключить это выражение в кавычки вообще, можно просто использовать:

sed 1,${retain}d

Для предотвращения проблем со странными именами файлов (воображают имя файла с новой строкой) использовать 0 как разделитель строки. Также я не совсем уверен, что Вы сортируете там к reversely виду к прошлому времени доступа, которое я сделал бы:

find -maxdepth 1 -type f -printf "%A@ %p\0" | sort -zr | sed -z 's/[^ ]* //;'1,${retain}d

Можно измениться 0 к новой строке с tr \\0 \\n. Для подсчета разграниченных нулем строк, можно использовать tr -cd '\0' | wc -c, посмотрите количество nul разграниченные объекты в файле · U&L.

Объяснения

  • find -maxdepth 1 -type f -printf "%A@ %p\0" – найдите каждый файл (-type f) в текущем каталоге, не ища подкаталоги (-maxdepth 1) и печать "%A@ %p\0" (без новой строки!) для него.
    %A@ заменяется временем доступа файла в секундах с эпохи, %p именем файла и \0 нулевым символом посмотрите man find/EXPRESSION/ACTIONS/-printf для полного списка Escape и директив.
  • sort -zr – вид zero-разграниченные данные в rпорядок everse
  • sed -z 'a;b – работайте sed выражения a и b на каждой записи с zero как разделитель записи
    Вы только нуждаетесь к символам кавычки, особенным для оболочки, видите мое сообщение при заключении в кавычки здесь. На самом деле в этом случае единственная вещь, которую необходимо заключить в кавычки, ; (путем выхода или с одинарными или двойными кавычками), таким образом, sed -z s/[^ ]* //\;1,${retain}d прекрасен также.
    • s/[^ ]* //sзамените первой строкой, не содержащей пробел (= все до первого пробела) и пробела, который следует, это ни с чем (= удаляют его),
    • 1,${retain}d – удалите первое $retain записи
1
ответ дан 7 December 2019 в 15:15

Другие вопросы по тегам:

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