
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 rm
funcionarí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 rm
funcionaría (¿incluso con nombres de archivos con espacios, etc.?)
No. xargs
de 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 echo
imprime 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 -0
que 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 head
tampoco servirá de mucho.
Estoy obligado a advertirte queanalizar la salida de ls
se 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 $size
variable qué archivos son realmente "grandes". Si desea que se le pregunte antes de cada eliminación, utilice el -i
interruptor: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 stat
tenga un formato diferente para obtener el tamaño. En otras palabras, --format "%s"
es posible que la opción no funcione. ¡Compruebe man stat
en 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 OL
para 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