Mover directorios en los que terminan los nombres: número que coincide con un archivo list.txt

Mover directorios en los que terminan los nombres: número que coincide con un archivo list.txt

Gráfico de estructura de carpetas:

ingrese la descripción de la imagen aquí

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 Destinationy 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.txtlínea por línea. Para cada línea $lintenta mover el directorio nombrado Source/Car$la Destination/..

El componente de nombre de ruta de punto Destination/.es un truco en caso de que Destinationno exista. Si Destinationno 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 whilebucle no reconoce la última línea?).

información relacionada