Gráfico de estructura de carpetas:
Soy muy nuevo en secuencias de comandos y comandos de shell avanzados. Tengo conocimientos fundamentales de terminales, pero nunca antes había intentado crear una automatización como esta. Un novato puro.
He simplificado mi objetivo en esta publicación, pero el proyecto real sería de unos miles de carpetas.
Básicamente tengo una carpeta de Origen y Destino. La carpeta Fuente tiene directorios con el prefijo "Car" seguido de "tres números"
Tengo un archivo de texto llamado list.txt en la carpeta Fuente que es una lista de "tres números" por línea.
Me gustaría escribir un comando o un script que busque directorios y lea la lista. Si los últimos tres dígitos del nombre del directorio coinciden con los tres dígitos de la lista. Me gustaría mover las carpetas coincidentes a la carpeta de Destino.
He leído una variedad de métodos usando find, -exec mv, xargs, "mientras IFS lee" y realmente no sé cuál es la mejor manera de abordar esto. Recién estoy comenzando y esperaba que alguien en este foro pudiera intervenir y no golpearme.
Respuesta1
Un script para ejecutar en el directorio principal de Destination
y Source
( .
en su imagen):
#!/bin/sh
while IFS= read -r l; do
mv "Source/Car$l/" Destination/.
done < Source/list.txt
Este script lee Source/list.txt
línea por línea. Para cada línea $l
intenta mover el directorio nombrado Source/Car$l
a Destination/.
.
El componente de nombre de ruta de punto Destination/.
es un truco en caso de que Destination
no exista. Si Destination
no existiera entonces el primero mv "Source/Car…/" Destination/
cambiaría el nombre Source/Car…/
a Destination/
en lugar de ponerlo dentro Destination/
. El punto marca la diferencia: si el objetivo existe Destination/.
y Destination/
no existe, entonces nuestro mv
(s) comando(s) saldrá(n) con un error.
El guión esmudo, no realiza ninguna verificación de cordura sobre lo que lee Source/list.txt
. Por ejemplo, si hay una línea 001/../../../../../../../../../../home/roco/.ssh
, el script posiblemente moverá su ~/.ssh/
directorio a Destination/
. Si hay una línea vacía, el script intentará moverse Source/Car/
. Si la última línea está incompleta entonces no llegará mv
(ver¿Por qué este while
bucle no reconoce la última línea?).