Rekurencyjnie usuwaj pliki o rozmiarze mniejszym niż 1 MB

Odpowiedzi:

21

Można to zrobić za pomocą find:

find . -type f -size -1M -exec rm {} +

Zauważ, że rekurencyjnie zejdzie to do podkatalogów i bezwarunkowo usunie wszystkie pliki mniejsze niż 1 megabajt. Bądź ostrożny.

Sven Marnach
źródło
brakuje Ci argumentu ścieżki dofind
@Useless: To GNU find. :)
Sven Marnach
2
@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.
chessofnerd
10

To powinno wykonać zadanie:

$ find <directory> -type f -size -1M -delete
jcollado
źródło
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
Nieprzydatny
źródło
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.
1

Próbować

odnaleźć . -size -1M -exec rm {} \;

ahvargas
źródło
1
Jest to świetne dla użytkowników spoza GNU. Dzięki! to samo co odpowiedź @ Svena, ale z \;na końcu zamiast+
hamx0r
-1

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.

for file in *;
  do
    file_size=$(du $file | awk '{print $1}');
    if [ $file_size == 0 ]; then
        echo "Deleting empty file $file with file size $file_size!";
        echo "rm -f $file";
    fi;
done

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.

Steen Schütt
źródło
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.
Sven Marnach