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=0diciéndole al shell que comience a iterar en 0j=$(stat ~/Documents/* --printf "%in" | wc -l )esto es configurar la variableja 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 dejmenos el número de veces que se ha ejecutado el bucle es inferior a 8 y, si es así,mv -v -- "$k" ~/AnotherDirectorymover el archivo al nuevo directorio