2016-03-17 4 views
0

Я пытаюсь удалить файлы в каталоге с именем Date_Sources. В этом каталоге есть 5 подпапок, которые называются Test1Test2 ... Test5.Удаление всех файлов .csv за исключением последнего файла в Linux

Я знаю, как удалить файлы каждые 90 дней:

find /home/deployer/Data_Sources/.../.. -mtime +90 -type f -exec rm -r '{}' \; 

Как я могу убедиться, что мой скрипт удалит все файлы через 90 дней КРОМЕ новый файл (за каждый подкаталог)?

Таким образом, сценарий должен перейти к Date_Sources/Test1, Data_sources/Test2, ... и т. Д. И убедиться, что все файлы удалены через 90 дней, кроме самого нового.

ответ

3

Что-то вроде:

find /home/deployer/Data_Sources -maxdepth 1 -mindepth 1 -type d > afile 
while IFS= read -r subdir 
do 
    find "$subdir" -mtime +90 -type f -printf "%T+\t%p\n" \ 
     | sort \ 
     | head -n-1 \ 
     | sed 's|[[:blank:]]\+| |' \ 
     | cut -f 2 -d " " > bfile 
    while IFS= read -r each 
    do 
    rm -vf "$each" 
    done < bfile 
done < afile 
rm -f bfile afile 

Объяснение:

найти все каталоги в /home/deployer/Data_Sources в непосредственной директории (-maxdepth 1) и исключая себя (-mindepth 1), и дамп это в файл с именем afile

find /home/deployer/Data_Sources -maxdepth 1 -mindepth 1 -type d > afile 

Прочтите каждую строчку от afile и храните в enviro nment переменная subdir (см done линии этого цикла, чтобы увидеть, что afile в настоящее время поступает в контур while)

while IFS= read -r subdir 
do 

Выполнить команду find на каждый subdir, перечисляя только файлы старше 90 дней (и распечатать временную метку с файлом)

find "$subdir" -mtime +90 -type f -printf "%T+\t%p\n" \ 

sort выходе из find

 | sort \ 

захватить все, кроме последней строки sort вывода (последняя строка нового файла)

 | head -n-1 \ 

заменить все многочисленные пробелы в одном пространстве

 | sed 's|[[:blank:]]\+| |' \ 

захватить второй столбец из выход, определяющий пространство как разделитель; все сбрасываются в файл под названием bfile.(Может, вероятно, использовать вкладку в качестве разделителя как-то и не использовать sed выше, но я не был уверен, как определить его так, что это будет работать, -d "\t", конечно, не сделать трюк)

 | cut -f 2 -d " " > bfile 

Теперь, прочитать bfile строки за строкой и хранить в each переменном окружении (опять-таки: Смотрите сделать линии, чтобы показать bfile будучи конвейер в)

while IFS= read -r each 
    do 

на самом деле сделать удаление старых файлов (быть многословными и подавляя подсказку)

rm -vf "$each" 
    done < bfile 
done < afile 

удалить временные файлы bfile и afile

rm -f bfile afile 

Примечание:

-Обновленное удалить использование for петель, чтобы правильно обрабатывать специальные символы и пробелы в путях; также двойные кавычки по переменным (как предложено @ mklement0)

+0

Спасибо! Я просто хочу убедиться, что я на правильном пути, вы можете сделать это с помощью подпапок. Я имею в виду, как указать подпапки здесь, потому что есть 5. Может ли это быть/Data_Sources и все? например: для каждого в $ (find/home/deployer/Data_Sources/-mtime +90-type f -printf "% T + \ t% p \ n" \ Я не уверен, что произойдет после Data_sources. Еще раз спасибо – Rohamsk

+0

@Rohamsk: Я думаю, у меня есть то, что вы запрашивали сейчас. – ryry1985

+0

@Rohamsk: исправлена ​​ошибка Я нашел – ryry1985

Смежные вопросы