Quiero copiar los últimos archivos usados (o tal vez creados) de un tamaño total a otra carpeta. ¿Es esto posible sin herramientas adicionales?
Tengo una unidad USB de cierto tamaño que es menor que el tamaño total de una carpeta. Como no puedo copiar todos los archivos al USB, me gusta copiar según el uso más reciente hasta que no quede más espacio. Idealmente, el método también admite la actualización de los archivos sin la necesidad de borrarlos todos y volver a copiarlos.
Respuesta1
Suponiendo (según la etiqueta [linux]) que tenga bash
disponible, además de los comandos stat
y ; sort
suponiendo además que desea sincronizar primero los archivos modificados más recientemente (consulteestadística del hombrepara otras opciones de marcas de tiempo), aquí hay un script bash que recorrerá todos los archivos en el directorio actual ( for f in *
es la línea clave para eso), reuniendo sus últimas marcas de tiempo modificadas en una matriz, luego recorrerá las marcas de tiempo ordenadas y impresiones - ¡una muestra! -- comando rsync para cada archivo (actualmente tiene información de depuración de marca de tiempo adjunta como prueba).
Por supuesto, tendrás que ajustar el comando rsync para tu situación particular. Este script generará comandos rsync para cada archivo en el directorio actual; Mi sugerencia sería ejecutar estos rsync "a ciegas", dejando que los del final fallen, o ponerlos en un script para ejecutarlos por separado.
Este script no intenta optimizar la utilización del espacio del destino de ninguna manera; el único orden que realiza es la marca de tiempo de la última modificación (y el orden arbitrario de la matriz asociativa en caso de que haya varios archivos modificados en el mismo segundo). .
#!/usr/bin/env bash
declare -A times
# gather the files and their last-modified timestamp into an associative array,
# indexed by filename (unique)
for f in *
do
[ -f "$f" ] && times[$f]=$(stat -c %Y "$f")
done
# get the times in (unique) sorted order
for times in ${times[@]}
do
echo $times
done | sort -run | while read t
do
# then loop through the array looking for files with that modification time
for f in "${!times[@]}"
do
if [[ ${times[$f]} = $t ]]
then
echo rsync "$f" -- timestamp ${times[$f]}
fi
done
done
Respuesta2
Debe ordenar sus archivos por fecha de modificación y luego pasar los nombres en ese orden rsync
para copiarlos. También puedes utilizarlo cp
en su lugar, pero rsync
es más eficiente.
Ya hay un hilo sobre cómo hacer esto en superuser.com:https://superuser.com/a/208749/554082