удалить самые старые файлы

удалить самые старые файлы

Я пытаюсь удалить старые файлы из каталога и оставить только 3 новых файла.

cd /home/user1/test

while [ `ls -lAR | grep ^- | wc -l` < 3 ] ; do

    rm `ls -t1 /home/user/test | tail -1`
    echo " - - - "

done

что-то не так с условным оператором.

решение1

Если вы хотите перебрать файлы,никогда не использоватьls*. tl;dr Существует множество ситуаций, когда вы можете удалить не тот файл или даже все файлы.

Тем не менее, к сожалению, это сложная вещь, которую можно сделать прямо в Bash . Есть рабочий ответ надублирующий вопрос мой еще более старыйfind_date_sortedкоторый вы можете использовать с небольшими изменениями:

counter=0
while IFS= read -r -d '' -u 9
do
    let ++counter
    if [[ counter -gt 3 ]]
    then
        path="${REPLY#* }" # Remove the modification time
        echo -e "$path" # Test
        # rm -v -- "$path" # Uncomment when you're sure it works
    fi
done 9< <(find . -mindepth 1 -type f -printf '%TY-%Tm-%TdT%TH:%TM:%TS %p\0' | sort -rz) # Find and sort by date, newest first

* Без обид, ребята - я тоже lsраньше пользовался. Но это действительно небезопасно.

Редактировать:Новыйfind_date_sortedс модульными тестами.

решение2

Чтобы удалить все файлы, кроме трех самых новых, с помощью zsh glob, вы можете использовать Om(заглавную букву O) для сортировки файлов от самых старых к самым новым и нижний индекс для выбора нужных файлов.

rm ./*(Om[1,-4])
#    | ||||  ` stop at the 4th to the last file (leaving out the 3 newest)
#    | |||` start with first file (oldest in this case)
#    | ||` subscript to pick one or a range of files
#    | |` look at modified time
#    | ` sort in descending order
#    ` start by looking at all files

Другие примеры:

# delete oldest file (both do the same thing)
rm ./*(Om[1])
rm ./*(om[-1])

# delete oldest two files
rm ./*(Om[1,2])

# delete everything but the oldest file
rm ./*(om[1,-2])

решение3

Самый простой способ — использовать zsh и егоквалификаторы glob: Omсортировка по убыванию возраста (т.е. сначала самые старые) и [1,3]сохранение только первых трех совпадений.

rm ./*(Om[1,3])

Смотрите такжеКак отфильтровать глоб в zshдля получения дополнительных примеров.

И прислушайтесьсовет l0b0: ваш код будет ужасно сломан, если имена файлов содержат специальные символы оболочки.

решение4

Во-первых, -Rопция предназначена для рекурсии, что, вероятно, не то, что вам нужно — она будет искать также во всех подкаталогах. Во-вторых, оператор <(когда он не рассматривается как перенаправление) предназначен для сравнения строк. Вероятно, вам нужно -lt. Попробуйте:

while [ `ls -1A | grep ^- | wc -l` -lt 3 ]

Но я бы использовал find здесь:

while [ `find . -maxdepth 1 -type f -print | wc -l` -lt 3 ]

Связанный контент