Gráfico da estrutura de pastas:
Sou muito novo em comandos e scripts avançados de shell. Tenho conhecimento fundamental de terminal, mas nunca tentei criar uma automação como esta antes. Um puro novato.
Simplifiquei meu objetivo neste post, mas o projeto real seria para alguns milhares de pastas.
Basicamente eu tenho uma pasta de origem e destino. A pasta Source possui diretórios com o prefixo “Car” seguido de “três números”
Eu tenho um arquivo de texto chamado list.txt na pasta Source, que é uma lista de “três números” por linha.
Gostaria de escrever um comando ou script que encontre diretórios e leia a lista. Se os últimos três dígitos do nome do diretório corresponderem aos três dígitos da lista. Gostaria de mover as pastas correspondentes para a pasta Destino.
Eu li uma variedade de métodos usando find, -exec mv, xargs, “while IFS read” e realmente não sei a melhor maneira de abordar isso. Estou apenas começando e esperava que alguém neste fórum pudesse intervir e não me bater.
Um script para ser executado no diretório pai de
Destination
eSource
(.
na sua imagem):Este script lê
Source/list.txt
linha por linha. Para cada linha$l
ele tenta mover o diretório nomeadoSource/Car$l
paraDestination/.
.O componente ponto pathname
Destination/.
é um truque casoDestination
não exista. SeDestination
não existisse então o primeiromv "Source/Car…/" Destination/
seria renomeadoSource/Car…/
paraDestination/
em vez de colocá-lo dentro deDestination/
. O ponto faz a diferença: se o alvo existeDestination/.
eDestination/
não existe, então nossomv
(s) comando(s) sairão com um erro.O script é burro , ele não realiza nenhuma verificação de integridade do que lê
Source/list.txt
. Por exemplo, se houver uma linha001/../../../../../../../../../../home/roco/.ssh
, o script possivelmente moverá seu~/.ssh/
diretório paraDestination/
. Se houver uma linha vazia, o script tentará moverSource/Car/
. Se a última linha estiver incompleta, ela não será concluídamv
(consulte Por que essewhile
loop não reconhece a última linha? ).