Eliminar algunos de los archivos más grandes de un directorio

Eliminar algunos de los archivos más grandes de un directorio

Me gustaría eliminar una cierta cantidad de los archivos más grandes de un directorio.

Puedo obtener los nombres de los archivos de los primeros diez con:

ls -S | head(o uno más rico aunque más complejo de analizar ls -lS | head)

¿Cómo se los pasaría a rm? a través de xargs?

Entonces ls -S | head | xargs rmfuncionaría (¿incluso con nombres de archivos con espacios, etc.?)

¿Existe una forma mejor y más segura?

Lo siento, pero no pude probar esto por miedo a cometer un error (el directorio tiene cosas que realmente no quiero borrar).

Yo uso MacOS.

Respuesta1

Entonces ls -S | head | xargs rmfuncionaría (¿incluso con nombres de archivos con espacios, etc.?)

No. xargsde forma predeterminada se divide en cualquier espacio en blanco, no solo en nuevas líneas. Y no puedes ver eso con | xargs echo, ya que echoimprime todos sus argumentos, separados por espacios. (Algo así | xargs printf "%s\n"los imprimiría separados por nuevas líneas, por lo que verá si la división ocurre en medio del nombre de un archivo).

Al menos GNU xargs tiene -d '\n'que dividirse solo en nuevas líneas, y muchas versiones de xargs tienen -0que dividirse en caracteres NUL (va con find -print0). Querrá al menos el primero, pero en el caso general los nombres de los archivos también pueden contener nuevas líneas, en cuyo caso headtampoco servirá de mucho.

Estoy obligado a advertirte queanalizar la salida de lsse considera incorrecto, aparentemente al menos algunas versiones alterarán la salida incluso sin la presencia de nuevas líneas. (Sin embargo, puede estar seguro si no tiene nuevas líneas o caracteres no imprimibles. Tal vez).

Respuesta2

Yo usaría un enfoque diferente. Algo como esto:

size=20000 # set a limit (in bytes), above these we will delete

for file in *
do
  [[ -f "$file" ]] || continue

  fileSize=$(stat --format "%s" "$file")

  if (( $fileSize > $size )) # if file is bigger than 20000 bytes
  then
    rm "$file" # delete the file
  fi          
done

De esta manera, podrá eliminar archivos que contengan espacios y podrá decidir con la $sizevariable qué archivos son realmente "grandes". Si desea que se le pregunte antes de cada eliminación, utilice el -iinterruptor:rm -i

Editar:
Me acabo de dar cuenta de que estás ejecutando esto en OS X. No tengo acceso a ninguna máquina con OS X en este momento, podría existir el riesgo de que OS X stattenga un formato diferente para obtener el tamaño. En otras palabras, --format "%s"es posible que la opción no funcione. ¡Compruebe man staten OS X!

Respuesta3

yo iría con;

find . -type f -size +10M -delete -print

Si realmente quieres seguir el camino de ls, tal vez;

ls -S | head -1 | while read af; do rm "$af"; done

Respuesta4

Usarzsh. Tiene un método para ordenar y seleccionar archivos por tamaño (y por fecha, que se usa con más frecuencia). Zsh es parte de la instalación estándar en OSX/macOS, pero es posible que deba instalarse por separado en otras variantes de Unix.

La forma de seleccionar (y ordenar) archivos usando criterios distintos al nombre esclasificatorios globales. Por ejemplo, para enumerar los 10 archivos más grandes de un directorio, utilice OLpara ordenar por tamaño decreciente (yolongitud) y [1,10]para enumerar los primeros 10:

ls -ldU *(OL[1,10])

Hacer esto sin zsh es más complicado, especialmente si necesita lidiar con nombres de archivos que contienen caracteres especiales. Siempre que los nombres de sus archivos no contengan caracteres no imprimibles o líneas nuevas, puede analizar la salida de ls.

ls -S | head -n 10 | while read -r filename; do echo rm -- "$filename"; done

información relacionada