Я пытаюсь создать сценарий удара, который повреждает самые старые файлы в каталоге с переменной, устанавливающей сумму файлов для сохранения.
Мой первый шаг должен был считать количество файлов более старым, чем количество набора 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 `,'
Что я пропустил?
Поскольку запятая не является специальным символом в 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
– вид z
ero-разграниченные данные в r
порядок eversesed -z 'a;b
– работайте sed
выражения a и b на каждой записи с z
ero как разделитель записи;
(путем выхода или с одинарными или двойными кавычками), таким образом, sed -z s/[^ ]* //\;1,${retain}d
прекрасен также. s/[^ ]* //
– s
замените первой строкой, не содержащей пробел (= все до первого пробела) и пробела, который следует, это ни с чем (= удаляют его),1,${retain}d
– удалите первое $retain
записи