Usuń pliki starsze niż określony plik

14

Muszę usunąć z folderu wszystkie pliki starsze niż określony plik.
Uruchamianie basha na CentOS 7.

Mam na to rozwiązanie, ale myślę, że powinien istnieć bardziej elegancki sposób:

reference_file=/my/reference/file

get_modify_time()
{
    stat $1 | grep -Po "Modify: \K[0-9- :]*"
}

pit=$(get_modify_time $reference_file)
for f in /folder/0000* ; do [[ "$pit" > "$(get_modify_time $f)" ]] && rm $f ; done
csny
źródło

Odpowiedzi:

28

Nie próbowałem tego, ale findpowinienem sobie poradzić z całą operacją:

$ find dir/ -type f ! -newer reference -delete

... lub ...

$ find dir/ -type f ! -newer reference ! -name reference -delete

Gruntownie:

  • ! -newer referencedopasowuje pliki, które zostały zmodyfikowane mniej niż reference.
  • -delete usuwa je.
  • ! -name referencewyklucza reference, w przypadku gdy znajduje się również pod dir/i chcesz go zachować.

To powinno usunąć wszystkie pliki starsze niż referencei znajdujące się pod nimi dir/.

John WH Smith
źródło
2
Doskonały :). Właśnie dodane, -maxdepth 1aby wyszukiwanie nie było rekurencyjne
csny
3
! -neweroznacza „nie nowszy”, a więc „starszy lub w tym samym wieku ”; sam plik zostanie dopasowany, jeśli znajdzie się na ścieżce find, tylko o czym należy pamiętać.
ferada
1
@ferada Nie zrobi tego, jeśli go wykluczysz, dlatego moja odpowiedź obejmuje również ! -name reference(patrz trzeci punkt).
John WH Smith
7

porównaj czasy modyfikacji plików przy testużyciu -nt(nowszych niż) i -ot(starszych niż) operatorów:

if [ "$file1" -ot "$file2" ]; then
    #do whatever you want;
fi
serenesat
źródło
2
Dzięki, to lepsze niż moje rozwiązanie, ale wciąż musisz iterować wszystkie pliki w folderze i porównywać ... Druga odpowiedź jest jeszcze bardziej elegancka
csny