¿Eliminar archivos de 0 bytes de tamaño a través de la línea de comando?


16

Entonces, obtuve un directorio lleno de otros directorios, y me preguntaba si era posible eliminar archivos que no tienen tamaño. Por lo general, estos archivos son de 0 bytes y dado que quiero fusionar todos estos subdirectorios, podría reemplazar un archivo perfectamente legítimo con un archivo de 0 bytes sin peso, y ahí está mi archivo legítimo. ¿Alguna forma de eliminar los archivos de cero bytes?

Respuestas:


34

Use el comando Buscar para buscar archivos por tamaño e imprimir los nombres de los archivos a la salida estándar.

find . -type f -size 0b -print

sustituya -printcon -deletepara eliminar los archivos en lugar de imprimirlos en la pantalla.

find . -type f -size 0b -delete

Ahora, ¿hay alguna forma de mover archivos de una ubicación a otra, y con los conflictos reemplazar si el tamaño es el mismo pero conservar ambas copias si el tamaño es diferente?
user245115

Esto suena como un trabajo para rsync .

77
Puedes usar en -emptylugar de -size 0b.
Kevin

6

Busque y elimine todos los archivos con un tamaño de 0 recursivamente:

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

Ejemplo:

% 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

4

También puedes hacerlo directamente en el shell. Esto podría ser útil si no desea eliminar archivos ocultos vacíos (aquellos cuyo nombre comienza con a .). Si bien también podría hacerlo find, una alternativa sería usar el shell en sí:

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

Explicación

  • shopt -s globstar: activa la opción globstar para bash que hace **coincidir uno o más subdirectorios. **/*coincidirá con todos los archivos y directorios en el directorio actual y todos sus subdirectorios.
  • for file in **/*; do ...; done : iterar sobre todos los archivos y directorios encontrados;
  • [ ! -s "$file" ]: [ -s "$file" ]es verdadero si el archivo existe y no está vacío. Por lo tanto, [ ! -s "$file" ](lo !inverso a la prueba) es cierto si el archivo no existe o si está vacío.
  • [ -f "$file" ]: verdadero si el archivo es un archivo normal. No es un directorio o un archivo de dispositivo o un enlace simbólico, etc.
  • rm "$file" : borra el archivo.

La &&asegurar que el próximo comando sólo se ejecuta si el anterior fue un éxito por lo que esto sólo eliminar archivos vacíos, regulares.


y pensé, mi respuesta es complicada :) +1
AB

2

Aunque la mayoría de las respuestas anteriores son correctas, eche un vistazo a este comando:

Un archivo de 0 bytes significa un archivo vacío

aunque puedes ejecutar este comando:

find . -type f -empty -delete

Esto eliminará todos los archivos vacíos.

Puedes echar un vistazo a esos archivos antes de eliminarlos:

find . -type f -empty

En Ubuntu 14.04 LTS, sin el -type f, -emptytambién eliminará directorios vacíos. Acabo de revisar la página del manual.
Bulrush
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.