
Esta es mi primera pregunta, ¡gracias por permitirme preguntar y por leer mi pregunta!
Estoy bajo Ubuntu 22.04 w. GNOME Shell y bash shell. Tengo una carpeta con más de 800 subdirectorios. Cada subdirectorio contiene de 4 a 8 versiones del mismo vídeo en diferentes resoluciones. Para cada video/subdirectorio quiero mantener solo la mejor resolución.
¿Cómo elimino recursivamente todos los archivos en todos los subdirectorios manteniendo solo el archivo más grande en cada subdirectorio?
Respuesta1
Lo siento, no voy a escribir un script para usted, pero aquí hay un posible algoritmo que podría usarse. (Si bien lo siguiente utiliza elementos de secuencia de comandos, está lejos de ser una secuencia de comandos precisa y simplemente intentar conectar comandos podría ser catastrófico)
Antes de hacer algo de esto, le recomiendo copiar toda la estructura del directorio a otro disco donde pueda probar un script antes de ejecutarlo y eliminar accidentalmente archivos que no pueda recuperar.
- Desde el directorio superior
fldrLst='find ./ -type d'
(estoy usando comillas simples para las marcas izquierdas) - Desde el directorio superior, recorra
$fldrLst
mientras hace lo siguiente- Obtenga una lista de archivos de una sola hoja de directorio en tamaño de archivo descendente:
fileLst='find $fldrList[n] -type f -maxdepth 1 -exec ls -al {} \; | sort k 5 -nr'
donde[n]
se encuentra un miembro específico de la matriz de lista. - Cuente archivos en la hoja del directorio:
echo $fildLst | wc -l
- Elimine cada archivo después de la primera entrada (que debería ser el archivo más grande): recorra
$fileLst
y eliminerm $fileList[n]
(donde la primeran
es la segunda entrada en la matriz).
- Obtenga una lista de archivos de una sola hoja de directorio en tamaño de archivo descendente:
Esto debería encaminarlo por el camino correcto para realizar su tarea.
Si esta respuesta es útil para ayudarlo a llegar a su solución, asegúrese de marcarla como respuesta o votarla como una solución parcial.
Respuesta2
Linux: elimina todos los archivos excepto el más grande
Versión de prueba, solo se eliminarán los archivos ls:
find -type d -exec sh -c 'find "$0" -maxdepth 1 -mindepth 1 -type f -exec stat --printf "%s %n\0" \{\} + | sort -znr | tail -zn +2' {} \; | cut -zf 2- -d " " | xargs -0r ls -l
Versión funcional, eliminará sus archivos:
find -type d -exec sh -c 'find "$0" -maxdepth 1 -mindepth 1 -type f -exec stat --printf "%s %n\0" \{\} + | sort -znr | tail -zn +2' {} \; | cut -zf 2- -d " " | xargs -0r rm
código original porKamil Maciorowski