Usunąć pliki o rozmiarze 0 bajtów za pomocą wiersza polecenia?

16

Mam więc katalog wypełniony innymi katalogami i zastanawiałem się, czy można usunąć pliki, które nie mają rozmiaru. Zazwyczaj pliki te mają 0 bajtów, a ponieważ chcę scalić wszystkie podkatalogi, mógłbym zastąpić całkowicie prawidłowy plik nieważkim plikiem 0-bajtowym, i tam jest mój legalny plik. Jakikolwiek sposób na usunięcie plików z bajtami zerowymi?

użytkownik245115
źródło

Odpowiedzi:

34

Użyj polecenia Znajdź, aby znaleźć pliki według rozmiaru i wydrukować nazwy plików na standardowe wyjście.

find . -type f -size 0b -print

zastąp -printje, -deleteaby usunąć pliki zamiast drukować je na ekranie.

find . -type f -size 0b -delete

źródło
Czy jest jakiś sposób na przeniesienie plików z jednej lokalizacji do drugiej, aw przypadku konfliktów zastąpić, jeśli rozmiar jest taki sam, ale zachować obie kopie, jeśli rozmiar jest inny?
user245115,
To brzmi jak zadanie dla rsync .
7
Możesz użyć -emptyzamiast -size 0b.
Kevin
6

Znajdź i usuń wszystkie pliki o rozmiarze 0 rekurencyjnie:

find . -type f -size 0 -print0 | xargs -I{} -0 rm {}

Przykład:

% ls -og   
total 4
-rw-rw-r-- 1 0 Jun  7 20:31 bar
-rw-rw-r-- 1 5 Jun  7 20:29 foo

% find . -size 0 -print0 | xargs -I{} -0 rm {}

% ls -og                                      
total 4
-rw-rw-r-- 1 5 Jun  7 20:29 foo
AB
źródło
4

Możesz to również zrobić bezpośrednio w powłoce. Może to być przydatne, jeśli nie chcesz usuwać pustych ukrytych plików (tych, których nazwa zaczyna się na a .). Chociaż możesz to również zrobić find, alternatywą byłoby użycie samej powłoki:

shopt -s globstar
for file in **/*; do [ ! -s "$file" ] && [ -f "$file" ] && rm "$file"; done

Wyjaśnienie

  • shopt -s globstar: włącza opcję globstar dla bash, która powoduje **dopasowanie jednego lub więcej podkatalogów. **/*dopasuje wszystkie pliki i katalogi w bieżącym katalogu i wszystkich jego podkatalogach.
  • for file in **/*; do ...; done : iteruj po wszystkich znalezionych plikach i katalogach;
  • [ ! -s "$file" ]: [ -s "$file" ]ma wartość true, jeśli plik istnieje i nie jest pusty. Dlatego [ ! -s "$file" ]( !odwraca test) jest prawdą, jeśli plik nie istnieje lub jest pusty.
  • [ -f "$file" ]: true, jeśli plik jest zwykłym plikiem. Nie katalog, plik urządzenia ani dowiązanie symboliczne itp.
  • rm "$file" : usuń plik.

&&Zapewnić, że następne polecenie jest uruchamiane tylko wtedy, gdy poprzedni był udany, więc to będzie usunąć tylko pusty, zwykłe pliki.

terdon
źródło
i pomyślałem, że moja odpowiedź jest skomplikowana :) +1
AB
2

Chociaż większość powyższych odpowiedzi jest poprawna, spójrz na to polecenie:

Plik o rozmiarze 0 bajtów oznacza pusty plik

chociaż możesz uruchomić to polecenie:

find . -type f -empty -delete

spowoduje to usunięcie wszystkich pustych plików.

Możesz poszukać tych plików przed usunięciem:

find . -type f -empty
Maythux
źródło
Ubuntu 14.04 LTS na bez -type f, -emptybędzie również usunąć puste katalogi. Właśnie sprawdziłem stronę podręcznika.
Sitowie