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

Вы попробовали изменение consolefont к другому значению? У меня была та же проблема и

    consolefont="cyr-sun16"

хорошо работает для меня.

9
25.11.2018, 02:57
8 ответов

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

Тем не менее, к сожалению, это - хитрая вещь сделать правильно в 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 с модульными тестами.

9
27.01.2020, 20:06
  • 1
    I, второй часть о не парсинге ls. Также сценарий аккуратен, но я думаю, что он мог быть сделан в одном лайнере, позволить мне проверить... –  rahmu 05.04.2012, 15:10
  • 2
    Ну, можно всегда уплотнять код Bash в остроту, но проблема - будет ли это читаемым :) –  l0b0 05.04.2012, 15:59
  • 3
    , Если я могу беспощадно украсть идею из @Peter. O, попробовать ((++counter>3)) как Ваш тест. Это приятно сжато. Что касается острот: Если краткость является беспокойством, переносят код в функцию, то не волнуйтесь об этом. –  Sorpigal 05.04.2012, 16:38
  • 4
    @Sorpigal Аккуратный ярлык –  l0b0 05.04.2012, 16:39

Безусловно самый легкий метод должен использовать zsh и его спецификаторы шарика: Om к виду путем уменьшения возраста (т.е. самый старый первый) и [1,3] сохранить только первые три соответствия.

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

См. также, Как я фильтрую шарик в zsh для большего количества примеров.

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

5
27.01.2020, 20:06
  • 1
    Woa woa содержит поезд, это - действительно полное решение в 1 строке? –  MetaGuru 15.05.2012, 19:34
  • 2
    @Ryan Это - zsh для Вас. –  Gilles 'SO- stop being evil' 15.05.2012, 21:28

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

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

Но я использовал бы, находят здесь:

while [ `find . -maxdepth 1 -type f -print | wc -l` -lt 3 ]
-1
27.01.2020, 20:06
  • 1
    Оба перестанут работать, если один или несколько имен файлов будет содержать '$\\n'. –  Rany Albeg Wein 28.04.2013, 11:15

Я знаю, что это - грех для парсинга ls, но что относительно этого:

find . -type f -maxdepth 1 | xargs ls -ltr | sed '1,3d' | awk '{print $9}' | xargs rm

Быстрый тест с 5 пустыми файлами:

$ >1
$ >2
$ >3
$ >4
$ >5
$ find . -type f -maxdepth 1 | xargs ls -lt | sed '1,3d' | awk '{print $9}' | xargs rm
$ ls -1
3
4
5
-1
27.01.2020, 20:06
  • 1
    Этот перестанет работать по двум причинам - Парсинг ls вывод и использование find и xargs вместе неправильным способом. Если Вы объединяетесь find и xargs Я рекомендую Вам использовать finds -print0 и соответственно xargss -O опции. Чтение об Использовании Находит для получения дополнительной информации о предмете. Вы могли бы также хотеть смотреть и читать о том, почему Парсинг ls очень плох. –  Rany Albeg Wein 28.04.2013, 11:32

Можно использовать следующую функцию для получения новейшего файла в каталоге:

newest_in() 
{ 
    local newest=$1

    for f;do [[ $f -nt $newest ]] && newest="$f"; done;

    printf '%s\n' "$newest"
}

Дайте ему другой набор файлов исключением новейшего файла после каждого повторения.

Подсказка: при содержании начального набора файлов в массиве, названном "$ {файлы}", затем сохраните индекс новейшего файла, найденного, и unset 'files[index]' перед следующим повторением.

Использование: newest_in [set of files/directories]

Демонстрационный вывод:

[rany$] newest_in ./*
foo.txt
[rany$]
1
27.01.2020, 20:06

Эта острота делает все это, я думаю:

ls -t1 /home/user/test | tail -n +4 | xargs -I{} rm -- "{}"
-2
27.01.2020, 20:06
  • 1
    ls является инструментом для того, чтобы в интерактивном режиме посмотреть на информацию о файле. Его вывод отформатирован для людей и вызовет ошибки в сценариях. Используйте шарики или найдите вместо этого. Поймите почему: mywiki.wooledge.org/ParsingLs –  Rany Albeg Wein 28.04.2013, 11:34

Вот одно решение:

rm /appserver/webapplogs/$(ls -t1 /appserver/webapplogs/|tail -1)
-2
27.01.2020, 20:06
  • 1
    @bakbak ls является инструментом для того, чтобы в интерактивном режиме посмотреть на информацию о файле. Его вывод отформатирован для людей и вызовет ошибки в сценариях. Посмотрите здесь для понимания почему. Specificaly, говорящий о Вашем ответе - этот повредится, если один или несколько файлов будет содержать $ '\n' символ. Кроме того, Замена Команды (т.е. $ (...)) испытывает недостаток в двойных кавычках, который начинает обсуждение другой важной темы - Word Splitting! –  Rany Albeg Wein 28.04.2013, 11:23

Чтобы удалить все, кроме 3 новейших файлов, использующих ZSH GLAC, вы можете использовать OM (Capital 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])
5
27.01.2020, 20:06

Теги

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