La siguiente secuencia de comandos se ocupará de construir nuevos directorios como sea necesario y sólo mover de nuevo los archivos que aparecen dentro de un directorio dado, en sus respectivos subdirectorios, es decir. 0015, 0016, etc.
$ cat mover.sh
#!/bin/bash
find . -type f -name "*.mxf" -depth 1 -exec sh -c '
file="${1/\.\//}"
echo "$file"
dir=${file/[_.]*mxf/}
[ -d "$dir" ] || mkdir -p $dir
mv $file $dir/.
' find-sh {} \;
Con lo anterior en un archivo llamado mover.sh
y este archivo sea ejecutable a través del comando chmod +x mover.sh
podemos, a continuación, ejecute como esta, ./mover.sh
.
Ejemplo
Aquí tenemos el siguiente directorio donde algunos subdirectorios ya existen y que contienen sus respectivos archivos.
$ tree .
.
├── 0015.mxf
├── 0015_A01.mxf
├── 0015_A02.mxf
├── 0016.mxf
├── 0016_A01.mxf
├── 0016_A02.mxf
├── 0017
│ ├── 0017.mxf
│ ├── 0017_A01.mxf
│ └── 0017_A02.mxf
├── 0018
│ ├── 0018.mxf
│ ├── 0018_A01.mxf
│ └── 0018_A02.mxf
└── mover.sh
Ahora habíamos cd ~/somedir
donde *.mxf
archivos que necesitan para tener todo organizado se encuentran y ejecutar el ./mover.sh
script.
$ ./mover.sh
0015_A02.mxf
0015_A01.mxf
0016_A01.mxf
0016_A02.mxf
0015.mxf
0016.mxf
Así que nuestro script se ha identificado los archivos anteriores y confirmó que su subdirectorio existe y nuestro script se muevan (mv
)*.mxf a sus respectivos subdirectorios. Aquí podemos ver el estado de el directorio donde el *.archivos mxf reside después de ejecutar la secuencia de comandos:
$ tree
.
├── 0015
│ ├── 0015.mxf
│ ├── 0015_A01.mxf
│ └── 0015_A02.mxf
├── 0016
│ ├── 0016.mxf
│ ├── 0016_A01.mxf
│ └── 0016_A02.mxf
├── 0017
│ ├── 0017.mxf
│ ├── 0017_A01.mxf
│ └── 0017_A02.mxf
├── 0018
│ ├── 0018.mxf
│ ├── 0018_A01.mxf
│ └── 0018_A02.mxf
└── mover.sh
4 directories, 13 files
Cómo funciona
El script hace uso de una herramienta de UNIX llamado find
para producir una lista de los archivos que coinciden con el patrón *.mxf
. Esta lista, a continuación, reiteró a través de una serie de comandos se ejecutan en cada archivo encontrado:
-
file="${1/\.\//}"
- toma a cada nombre de archivo y elimina ./
que es el prefijo para cada uno de los nombres find
-
echo "$file"
- mostrar los resultados de este comando a la pantalla
-
dir=${file/[_.]*mxf/}
- eliminar cualquier trailing caracteres que coinciden con los patrones de _*.mxf
o *.mxf
-
[ -d "$dir" ] || mkdir -p $dir
- comprobar si el directorio de los archivos va a existe, si no lo hace
-
mv $file $dir/.
- mover este archivo en el directorio correspondiente
Ejecuta periódicamente esta
Una idea aquí sería la instalación de un cronjob que se ejecuta periódicamente en macOS para ejecutar esta secuencia de comandos. Usted puede leer más acerca de cómo realizar esta aquí en este tutorial titulado: planificar los trabajos con crontab en Mac OS X.
Los pasos básicos aquí son como sigue:
-
Crear una entrada crontab
$ env EDITOR=nano crontab -e
-
Agregar una entrada especificando en qué secuencia de comandos a ejecutar y cuando (cada 5 minutos)
0/5 * * * * cd ~/my/mxf/folder && ./mover.sh
-
Confirmar los cambios
$ crontab -l