Odpowiedzi:
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.
find
. :)
find
ogranicza 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. 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:
$ find <directory> -type f -size -1M -delete
-
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.
Tylko dla różnorodności i możliwego (prawdopodobnie marginalnego) wzrostu wydajności:
find <directory> -type f -size -1M -print0 | xargs -0 rm
xargs
proces.
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.
1M
.