Tengo una lista de carpetas que tienen fechas para los nombres. Las fechas están en el formato AAAAMMDD (por ejemplo, 20150129). Dentro de estas carpetas hay documentos de texto relacionados con esa fecha específica.
Me gustaría reestructurarlos en una jerarquía de carpetas de año a mes hasta la fecha, y mover los documentos de texto a la carpeta 'fecha' correspondiente más abajo en la jerarquía.
En otras palabras, me gustaría que la carpeta 'raíz' se nombrara después del año como 2015, y luego crear subcarpetas con meses como 01, y luego crear más subcarpetas con fechas como 29 que contengan los documentos de texto correspondientes .
Entonces el camino se vería como 2015/01/29/file.txt
o 2015>01>29>file.txt
.
He echado un vistazo a Automator y parece que algo como esto no es posible, aunque podría estar equivocado, así que me gustaría saber ...
¿Existe alguna solución fácil para este problema que cualquier laico pueda entender, por ejemplo, un flujo de trabajo de Automator, o esto requiere cierta comprensión de los comandos de terminal y las expresiones regulares?
¿Cómo se resolvería este problema siempre que haya una solución?
Respuestas:
Asumiendo que todas estas carpetas AAAAMMDD son parte del mismo directorio padre que podría ejecutar
for d in */; do
bucle lee todas las entradas de directorio, el seguimiento/
garantiza que solo los nombres de directorio coincidan[[ $d =~ [0-9]{8}/ ]]
prueba si la entrada actual consta de 8 dígitos, y continúa con la siguiente entrada si no${d:0:4}/${d:4:2}/${d:6:2}
utiliza la expansión de parámetros dentrobash
para crear una cadena que contiene la nueva ruta--
en ambosmkdir
ymv
previene en caso de que el directorio o nombre de archivo comience con a-
. Esto no puede suceder aquí, pero probablemente sea una buena práctica de todos modos.Gracias a @terdon y @ user3439894 por sus ideas sobre cómo mejorar el script original.
fuente
Puede usar lo siguiente en la Terminal.
cd
a la carpeta que contiene, luego ejecute lo siguiente:find . -type f
obtiene todos los archivos del directorio actual de forma recursiva.-exec bash -c
abre un shell para ejecutar los siguientes comandos.F=$(…)
abre una subshell y usa sed en la ruta del archivo para manipular la ruta en las carpetas.^\./([0-9]{4})([0-9]{2})([0-9]{2})
es una expresión regular con tres grupos de captura, como sigue: es reemplazo, donde cada grupo de captura ( , etc.) está separado por . crea los directorios para mover los archivos. mueve cada archivo a su carpeta correspondiente.\1/\2/\3
\1
/
mkdir -p -- $(dirname "$F")
mv -- "$1" "$F"
Esto toma la jerarquía de la izquierda y la convierte en la jerarquía de la derecha:
Si hay otros archivos en la carpeta que contiene una fecha como nombre, se moverán como si fueran una carpeta. Para evitar esto, reemplace la segunda línea con:
Esto
(?:/.+)
garantiza que la ruta tenga un componente posterior, por lo que ignora cualquier cosa sin un elemento secundario en el directorio principal que son archivos.fuente