@DanielAndersson: findogranicza liczbę argumentów do wywoływanego procesu, aby dopasować go do limitów systemu, w przeciwieństwie do tego rm *, który ma być wywołaniem pojedynczego procesu. findwywoła wiele wystąpień, rmjeśli to konieczne. I jestem prawie pewien, że znaki specjalne są traktowane poprawnie, w tym znaki nowej linii. Wolę -exec rmze względu -deletena elastyczność - na przykład ten ostatni nie oferuje możliwości usuwania plików chronionych przed zapisem.
Sven Marnach,
1
@Invoker: cofnąłem zmianę, ponieważ była niepoprawna. -1Moznacza mniej niż jeden megabajt według potrzeb. Twoja wersja usunie wszystkie pliki o rozmiarze dokładnie jednego megabajta, co wydaje się nieco bezcelową operacją.
Sven Marnach,
2
Wszystkim zainteresowanym, jeśli chcesz usunąć wszystkie pliki większe niż 1M, użyj polecenia find . -type f -size +1M -exec rm {} +. Zwróć uwagę na + 1M zamiast -1M.
Nie sądzę, abyśmy musieli rozdzielać łączniki z 1M.
Invoker
2
@Invoker, uważam, że -znak jest znakiem minus oznaczającym „mniej niż 1 mln”. Jeśli uruchomisz find <directory> -type f -size +1M -delete, usuniesz wszystkie pliki większe niż 1M.
chessofnerd,
tak, masz rację mój zły
Invoker
2
Tylko dla różnorodności i możliwego (prawdopodobnie marginalnego) wzrostu wydajności:
find <directory>-type f -size -1M-print0 | xargs -0 rm
Jak to ma być szybsze? Rozpoczyna dodatkowy xargsproces.
Sven Marnach
Teraz możesz mieć dwa procesory walczące o to samo urządzenie blokowe! Bardziej sensownie, operacje stat / readdir nie są synchronicznie blokowane przez operację unlink. To, czy będzie to prawdopodobnie lepsze, zależy oczywiście od wielkości poddrzewa, liczby plików, urządzenia itp.
Odpowiedzi na SO powinny być samodzielne - nie zamieszczaj zwykłego linku. (Ponadto kod w łączonym poście usuwa raczej puste pliki niż pliki mniejsze niż 1M).
Sven Marnach
@ SvvenMarnach nie możemy użyć $ file_size <1M w podanym linku do przykładowego kodu.
Nie, nie możemy, ponieważ skorupa nie zrozumie 1M.
Sven Marnach
Przez 1M miałem na myśli 1048576 konwertujący 1 MB na bajt
1
Cóż, jeśli przetestujesz, czy to naprawdę działa i skopiujesz kod do swojej odpowiedzi, może to stać się odpowiedzią SO.
Odpowiedzi:
Można to zrobić za pomocą
find
:Zauważ, że rekurencyjnie zejdzie to do podkatalogów i bezwarunkowo usunie wszystkie pliki mniejsze niż 1 megabajt. Bądź ostrożny.
źródło
find
find
. :)find
ogranicza liczbę argumentów do wywoływanego procesu, aby dopasować go do limitów systemu, w przeciwieństwie do tegorm *
, który ma być wywołaniem pojedynczego procesu.find
wywoła wiele wystąpień,rm
jeśli to konieczne. I jestem prawie pewien, że znaki specjalne są traktowane poprawnie, w tym znaki nowej linii. Wolę-exec rm
ze względu-delete
na elastyczność - na przykład ten ostatni nie oferuje możliwości usuwania plików chronionych przed zapisem.-1M
oznacza mniej niż jeden megabajt według potrzeb. Twoja wersja usunie wszystkie pliki o rozmiarze dokładnie jednego megabajta, co wydaje się nieco bezcelową operacją.find . -type f -size +1M -exec rm {} +
. Zwróć uwagę na + 1M zamiast -1M.To powinno wykonać zadanie:
źródło
-
znak jest znakiem minus oznaczającym „mniej niż 1 mln”. Jeśli uruchomiszfind <directory> -type f -size +1M -delete
, usuniesz wszystkie pliki większe niż 1M.Tylko dla różnorodności i możliwego (prawdopodobnie marginalnego) wzrostu wydajności:
źródło
xargs
proces.Próbować
źródło
\;
na końcu zamiast+
Możesz sprawdzić ten link http://ayaz.wordpress.com/2008/02/05/bash-quickly-deleting-empty-files-in-a-directory/ , ma dokładnie to, czego chcesz.
Możesz iterować wszystkie pliki za pomocą pętli for, a następnie użyć du i awk, aby znaleźć rozmiar pliku jak w powyższym przykładzie.
źródło
1M
.