Удалить папки, но оставить 20 новых, 7-дневной давности

En su comando actual, lftpno usa sftp, que sería FTP sobre el protocolo SSH, sino ftpsque es FTP sobre SSL.

Para que lftpfuncione como un cliente sftp, debe agregar sftp://al host al que se está conectando.

Si desea FTP sobre SSL, deberá cambiar el puerto en su comando del puerto 22 al puerto FTP (21 por defecto ).

2
26.06.2019, 17:16
4 ответа

Вы можете использовать statдля получения mtime каталогов, не анализироватьls

seven_days=$(date -d '7 days ago' '+%s')
stat -c "%Y %%n" /folder/folder1/*/ | sort -nr | tail -n +20 | while read -r mtime name; do
    if (( mtime < seven_days )); then
        echo "remove directory $name"
    fi
done

statвыводит mtime и имя папки.
Затем отсортируйте по mtime от самого нового до самого старого.
Затем игнорируйте первые 20 результатов.
Затем, в цикле,сравните mtime папок со временем недельной давности и решите сохранить или удалить.

Если выходные данные находят нужные каталоги, измените строку echo, чтобы удалить их

1
27.01.2020, 22:16

Нижеприведенный скрипт вам подойдет

#!/bin/bash
count=`find. -maxdepth 1 -type d | wc -l`
if [[ $count > 20 ]]
then
  under_7days=`find. -maxdepth 1 -type d -daystart -mtime -7 | wc -l`
  if [[ $under_7days >= 20 ]]
  then
    find. -maxdepth 1 -daystart -mtime +7 -exec rm -rvf {} \;
  else
    echo "Since total directories which created under 7 days is $under_7days"
  fi
elif [[ $count <= 20 ]]
then
  echo "Number of folders exsists in the path is $count"
fi

Я использовал максимальную глубину 1, поэтому будут учитываться только каталоги в текущем пути.

-1
27.01.2020, 22:16

Я вижу, вы пометили , но на всякий случай, если вы используете zsh, этот скрипт zsh может облегчить вам жизнь:

zmodload zsh/mapfile
startingdirs=( ${(f)mapfile[/tmp/test.txt]} )
for dir in $startingdirs
do
  deleteme=( $dir/*(N/m+7om[21,-1]) )
  rm -r $deleteme $^deleteme'@tmp'
done

Это загружает функцию mapfile(кредит)для чтения списка начальных каталогов из входного файла /tmp/test.txt в массив. Затем мы перебираем этот массив начальных каталогов и инициализируем другой массив каталогов-кандидатов для удаления. Этот список каталогов с -по -для удаления является результатом расширения подстановочного знака в начальном каталоге с набором «квалификаторов glob» :

.
  • N--устанавливает параметр NULL _GLOB для этого шаблона; если нет файлов, соответствующих (, потому что ни один из них не является достаточно старым, скажем ), результирующий массив будет пустым
  • /--ограничивает совпадения каталогами
  • m+7--ограничивает совпадения теми, которые имеют время модификации более 7 дней назад
  • om--"упорядочивает" или сортирует результирующий список по времени модификации, от новых к старым
  • [21,-1]--разделяет часть результирующего списка от элемента номер 21 до конца списка, в результате чего самые старые файлы находятся за пределами 20-го.

Затем мы вызываем rm -rдля результирующего списка каталогов вместе с расширением этого списка с добавлением @tmp. Благодаря ответу Стефана здесь за демонстрацию оператора конкатенации ^, который здесь добавляет одну строку -в кавычках @tmpк каждому элементу массива.

1
27.01.2020, 22:16

После нескольких болезненных итераций, Наконец-то я нашел решение, которое мне подходит:

#!/bin/bash

# Inserting folders names in a file by reverse order - new at the starnputt
ls -A /tmp/lab  | egrep -v "*@tmp" | sort -nr > /tmp/test.txt

# Removing 20 newst folders.
sed '1,20d' /tmp/test.txt > /tmp/new_removed.txt

# Checking if there are more than 20 folders, if not- exit.
NUMofFolders=`wc -l /tmp/new_removed.txt | awk '{print $1}'`

if [ $NUMofFolders -lt 20 ] ;
then
 echo "Only 20 folders exist"
 exit 1
else
echo "Running with the script"

fi

#Deleting files, after checking it is older than 7 days
input="/tmp/new_removed.txt"
FolderPATH="/tmp/lab"

while IFS= read -r line ;
do
if [[ $(find "$FolderPATH/$line" -maxdepth 1 -type d -mtime +7 -print -exec rm -rf {} +) ]]; then
echo "files Deleted"

fi
done < "$input"

unset NUMofFolders
unset input
unset FolderPATH
unset line
0
27.01.2020, 22:16

Теги

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