eliminar archivos más antiguos

eliminar archivos más antiguos

Estoy intentando eliminar archivos antiguos del directorio y dejar solo 3 archivos más nuevos.

cd /home/user1/test

while [ `ls -lAR | grep ^- | wc -l` < 3 ] ; do

    rm `ls -t1 /home/user/test | tail -1`
    echo " - - - "

done

algo anda mal con la declaración condicional.

Respuesta1

Si desea recorrer archivos,nunca usarls*. tl;dr Hay muchas situaciones en las que terminarías eliminando el archivo incorrecto, o incluso todos los archivos.

Dicho esto, desafortunadamente esto es algo complicado de hacer correctamente en Bash. Hay una respuesta funcional en unpregunta duplicada mi aun mayorfind_date_sortedque puedes usar con pequeñas modificaciones:

counter=0
while IFS= read -r -d '' -u 9
do
    let ++counter
    if [[ counter -gt 3 ]]
    then
        path="${REPLY#* }" # Remove the modification time
        echo -e "$path" # Test
        # rm -v -- "$path" # Uncomment when you're sure it works
    fi
done 9< <(find . -mindepth 1 -type f -printf '%TY-%Tm-%TdT%TH:%TM:%TS %p\0' | sort -rz) # Find and sort by date, newest first

* No se ofendan chicos, también lo usé lsantes. Pero realmente no es seguro.

Editar:Nuevofind_date_sortedcon pruebas unitarias.

Respuesta2

Para eliminar todos los archivos menos los 3 más nuevos usando un zsh glob, puede usar Om(O mayúscula) para ordenar los archivos del más antiguo al más nuevo y un subíndice para tomar los archivos que desea.

rm ./*(Om[1,-4])
#    | ||||  ` stop at the 4th to the last file (leaving out the 3 newest)
#    | |||` start with first file (oldest in this case)
#    | ||` subscript to pick one or a range of files
#    | |` look at modified time
#    | ` sort in descending order
#    ` start by looking at all files

Otros ejemplos:

# delete oldest file (both do the same thing)
rm ./*(Om[1])
rm ./*(om[-1])

# delete oldest two files
rm ./*(Om[1,2])

# delete everything but the oldest file
rm ./*(om[1,-2])

Respuesta3

Con diferencia, el método más sencillo es utilizar zsh y susclasificatorios globales: Ompara ordenar por edad decreciente (es decir, el mayor primero) y [1,3]retener solo los tres primeros partidos.

rm ./*(Om[1,3])

Ver también¿Cómo filtro un globo en zsh?para más ejemplos.

y haz casoEl consejo de l0b0: su código se romperá terriblemente si tiene nombres de archivos que contienen caracteres especiales del shell.

Respuesta4

En primer lugar, la -Ropción es recursiva, que probablemente no sea lo que desea; eso también buscará en todos los subdirectorios. En segundo lugar, el <operador (cuando no se considera una redirección) sirve para comparar cadenas. Probablemente quieras -lt. Intentar:

while [ `ls -1A | grep ^- | wc -l` -lt 3 ]

Pero yo usaría buscar aquí:

while [ `find . -maxdepth 1 -type f -print | wc -l` -lt 3 ]

información relacionada