Estoy tratando de mover los últimos 8 archivos de Documents
directorio a otro directorio, pero no quiero moverlos uno por uno a ese directorio específico. ¿Es posible moverlos con un sustituto de la tail
? comando, pero para directorios en lugar de archivos? Quiero decir que me gustaría hacerlo con algo como tail -8 ./Documents | mv ./Anotherdirectory
o con mv tail -8 ./Documents ./Anotherdirectory
.
De hecho, estoy buscando una forma inteligente de mover los últimos 8 archivos (como se indica en ls
) rápidamente (sin escribir cada nombre) al otro directorio. ¿Alguna sugerencia?
Respuesta aceptada:
Puedes usar for
, que recorre los archivos de forma ordenada y nos permite evitar analizar la salida de find
o ls
, para evitar problemas con espacios y otros caracteres especiales en los nombres de archivo. Muchas gracias a @muru por mejorar esto 🙂
i=0; j=$(stat ~/Documents/* --printf "%in" | wc -l); for k in ~/Documents/*; do if (( (j - ++i) < 8 )); then echo mv -v "$k" ~/AnotherDirectory; fi; done
Pruébalo primero con echo
, luego elimina echo
para mover los archivos.
Como guión:
#!/bin/bash
i=0
j=$(stat ~/Documents/* --printf "%in" | wc -l )
for k in ~/Documents/*; do
if (( (j - ++i) < 8 )); then
echo mv -v -- "$k" ~/AnotherDirectory
fi
done
de nuevo, elimine echo
después de probar para mover los archivos de verdad
Explicación
i=0
diciéndole al shell que comience a iterar en 0j=$(stat ~/Documents/* --printf "%in" | wc -l )
esto es configurar la variablej
a un entero igual al número total de archivos en el directorio. Gracias a la respuesta de Serg a mi propia pregunta sobre cómo contar archivos de manera confiable sin importar qué caracteres contengan sus nombresdo if (( (j - ++i) < 8 ))
para cada iteración del ciclo, pruebe si el resultado dej
menos el número de veces que se ha ejecutado el bucle es inferior a 8 y, si es así,mv -v -- "$k" ~/AnotherDirectory
mover el archivo al nuevo directorio