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.


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

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.

1

Próbować

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


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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.