Удалить файлы старше даты эпохи файла в списке - PullRequest
2 голосов
/ 11 октября 2019

У меня есть файл, который содержит полный путь к имени файла (разделенный пробелами) и последний столбец, в который я поместил дату изменения файла в эпоху.

/data/owncloud/c/files/Walkthrough 2019/#25 SEC-C03/Group Enterprise.jpg 1569314988

Я хочу удалить все разделенные пробеламифайлы с номером эпохи меньше 1568187717.

На данный момент сценарий выглядит следующим образом, но это, если с разделением пробелов не может работать: (

#!/bin/bash
IFS=$'\n'
while read i
        do printf "%s " "$i"
        stat --format=%Z $i
done < <(find /data/owncloud/*/files -type f) > filelistwithchangeddate

filetodelete=expr `date +'%s'` - 2592000

awk '{print $(NF)}'имеет последний номер столбца, так что каким-то образом нужно сравнить вывод awk с файловым декодером и удалить файлы, разделенные пробелами.

Обновление: Примерно так, как и должно быть:

for i in `cat filelistwithchangeddate `
do
if [ $(awk '{print $(NF)}' $i) -lt $filetodelete ]
then
echo "this will be deleted:"
awk '{$NF=""}1' $i
fi
done

Но нужно как-то исправить пробелы и запустить delete

Ответы [ 2 ]

0 голосов
/ 11 октября 2019

Этот ответ основан на этом :

Это легко сделать с помощью find. Обычно вы делаете:

$ find . -type f ! -newermt "@1569314988" -delete

, но если вы хотите выбрать время из файла (пример из OP):

$ t=$(awk '{print NF}' file)
$ [[ "$t" != "" ]] && find . -type f ! -newermt "@${t}" -delete

См. man find для получения подробной информации о значениифлаги и дополнительные модификации, которые могут понадобиться.

0 голосов
/ 11 октября 2019

Хорошо, спасибо, triplee, я думаю, это сработает:

IFS=$'\n'
while read i
        do printf "%s " "$i"
        stat --format=%Z $i
done < <(find /data/owncloud/*/files -type f) > /root/script/newpurge/filelistwithchangeddate


filetodelete=$(expr `date +'%s'` - 2592000)


awk -v epoch="$filetodelete" '$NF<epoch' /root/script/newpurge/filelistwithchangeddate > oldf
iles

awk '{$NF=""}1' /root/script/newpurge/oldfiles > marktodelete
sed -i "s/^/'/g" /root/script/newpurge/marktodelete
sed -i "s/[ ]\+$/'/g" /root/script/newpurge/marktodelete

for i in $(cat /root/script/newpurge/marktodelete)
do
        rm -f $i
done
...