Abrí Terminal que por defecto se abre a los directorio principal y ejecutó lo siguiente comando :
mkdir -p ./Documents/Archive/A/45 ./Documents/Archive/J/29 A761245 J647929
Esto creó dos nuevos directorios , A761245
y J647929
en el root de mi directorio principal y el estructura jerárquica de directorios dentro de mi Documents
directorio para recibirlos cuando se trasladen.
A continuación, utilizo lo siguiente comando compuesto para mover cualquier directorio cuyo nombre comenzó con un carácter alfabético en mayúsculas seguido de seis caracteres numéricos :
for d in *; do [[ -d $d ]] || continue; if [[ $d =~ ^([A-Z])([0-9]{4})([0-9]{2})$ ]]; then mv -n -v "$d" "./Documents/Archive/${BASH_REMATCH[1]}/${BASH_REMATCH[3]}/"; fi; done
El resultado de este comando compuesto era:
A761245 -> ./Documents/Archive/A/45/A761245
J647929 -> ./Documents/Archive/J/29/J647929
$
Este comando compuesto podría utilizarse en un bash
script Por ejemplo:
#!/bin/bash
for d in *; do
[[ -d $d ]] || continue
if [[ $d =~ ^([A-Z])([0-9]{4})([0-9]{2})$ ]]; then
mv -n -v "$d" "./Documents/Archive/${BASH_REMATCH[1]}/${BASH_REMATCH[3]}/"
fi
done
Esto funciona básicamente probando el nombre de cualquier directorio pasado para ajustarse a un carácter alfabético en mayúsculas seguido de seis caracteres numéricos utilizando grupos de captura y BASH_REMATCH
para construir el destino adecuado ruta de acceso para el mv
comando .
Sé que has dicho que el directorios de destino ya existen y el ejemplo bash
código arriba lo da por sentado sin ningún tipo de tratamiento de errores . Dicho esto, sin embargo, se podría añadir una línea de código que crearía la necesaria estructura jerárquica de directorios primero, como en el ejemplo siguiente:
#!/bin/bash
for d in *; do
[[ -d $d ]] || continue
if [[ $d =~ ^([A-Z])([0-9]{4})([0-9]{2})$ ]]; then
mkdir -p "./Documents/Archive/${BASH_REMATCH[1]}/${BASH_REMATCH[3]}"
mv -n -v "$d" "./Documents/Archive/${BASH_REMATCH[1]}/${BASH_REMATCH[3]}/"
fi
done
La frase única comando compuesto sería:
for d in *; do [[ -d $d ]] || continue; if [[ $d =~ ^([A-Z])([0-9]{4})([0-9]{2})$ ]]; then mkdir -p "./Documents/Archive/${BASH_REMATCH[1]}/${BASH_REMATCH[3]}"; mv -n -v "$d" "./Documents/Archive/${BASH_REMATCH[1]}/${BASH_REMATCH[3]}/"; fi; done
Utilizaría esta versión del comando compuesto y o bash
script .
Nota: Utilizando el -p
opción con el mkdir
comando creará el estructura jerárquica de directorios según sea necesario sin errar si ya existe. Este sería el camino que yo seguiría para asegurarme de que no intentas mover un directorio de fuentes a un inexistente directorio de destino .