2015-12-17 11 views
5

Istnieje kilka różnych tematów dotyczących stackoverflow dotyczących znalezienia/usunięcia najstarszego katalogu/plików w katalogu. Czytałem wiele z nich i widziałem mnóstwo różnych sposobów, które oczywiście działają dla niektórych osób w innych systemach, ale nie dla mnie w moim konkretnym przypadku.usuwa wszystkie stare katalogi oprócz X na FreeBSD przez Bash (bez -printf, ze spacjami, bez zsh)

Ograniczenia są:

Najbliższe, jakie dostałem, to coś takiego (nie jest kompletne):

find . -maxdepth 1 -d -name "Backup Set*" -print0 | xargs -0 stat -f "%m %N" | sort -r| awk 'NR>5' 

To daje mi katalogi które chcę usunąć jednak mają teraz timestamps poprzedzany, których nie jestem pewien, że gdybym rozebrać się i rura do RM i będzie powrót do sytuacji, w której nie mogę usunąć katalogi z miejscami w nich.

wyjściowa:

1450241540 ./Backup Set1 
1450241538 ./Backup Set0 

Dzięki za wszelką pomoc tutaj.


odpowiednich wiadomości, że mam spojrzał na:

https://superuser.com/questions/552600/how-can-i-find-the-oldest-file-in-a-directory-tree

Bash scripting: Deleting the oldest directory

Delete all but the most recent X files in bash

+0

robi 'stat 'output pozwala ci umieścić dodatkowe dbl-quotes, czyli' stat -f "% m \"% N \% "" "? Dobra Q, powodzenia. – shellter

Odpowiedz

3
... | awk 'NR>5' | while read -r timestamp filename; do rm -rf "${filename}"; done 

Kiedy jest więcej pól niż zmiennych określonych w read The remaind er jest po prostu zgrupowane w ostatniej określonej zmiennej. W naszym przypadku wyodrębniamy znacznik czasu i używamy wszystkiego, co jest, do nazwy pliku. Wykonujemy iterację wyjścia i uruchamiamy rm dla każdego wpisu.

Zalecam wykonanie testu z użyciem echo zamiast rm, aby najpierw można było zweryfikować wyniki.


Ewentualnie, jeśli wolisz to xargs -0 wersję:

... | awk 'NR>5' | while read -r timestamp filename; do printf "%s\0" "${filename}"; done | xargs -0 rm -rf 

To również używa while read ale drukuje każdego pliku z NUL separatora, który może być spożywana przez xargs -0.

+0

Dzięki temu spróbowałem tego pierwszego i działa - z zastrzeżeniem, że musisz uruchomić go ze skryptu, nie byłem w stanie uruchomić go bezpośrednio z wiersza poleceń, ponieważ testowałem moje polecenia w ten sposób. – skimon

0

potokiem tego polecenia cut cut -d ' ' -f 2- odbędzie się znacznik czasu

prosty przykład

echo '1450241538 ./Backup Set0'|cut -d ' ' -f 2- 

pozbędzie sygnatury czasowe

wyniki będą

./Backup Set0 
Powiązane problemy