Ниже представлено несколько сложное, но очень осторожное, чтобы быть правильным, даже с необычными или намеренно злонамеренными именами файлов. К сожалению, для него требуются инструменты GNU:
count=0
while IFS= read -r -d ' ' && IFS= read -r -d '' filename; do
(( ++count > 3 )) && printf '%s\0' "$filename"
done < <(find . -maxdepth 1 -type f -printf '%T@ %P\0' | sort -g -z) \
| xargs -0 rm -f --
Объяснение, как это работает:
<mtime> <filename><NUL>
для каждого файла в текущем каталоге. sort -g -z
выполняет числовую (с плавающей точкой, в отличие от целочисленной) числовую сортировку на основе первого столбца (раз) с линиями, разделенными с помощью NUL. read
в цикле while
отключает mtime (больше не требуется после выполнения sort
). read
в цикле while
читает имя файла (работает до NUL). xargs -0
затем добавляет это имя файла в список argv, который он собирает, чтобы вызвать rm
с.