use find para localizar, mover e ligar simbolicamente uma árvore de diretórios correspondente a [0-9] {1,10} / *

3

Eu preciso mover alguns diretórios e fazer links simbólicos para eles.

A estrutura do diretório se parece com:

/storage1
/storage1/123/named_directory_1
/storage1/123456/named_directory_2
/storage1/123456789/named_directory_3

Eu quero mover os diretórios named para os diretórios numerados correspondentes em outro lugar, assim:

/storage2
/storage2/123/named_directory_1
/storage2/123456/named_directory_2
/storage2/123456789/named_directory_3

e, em seguida, crie links simbólicos para esses diretórios nomeados. os diretórios numerados permanecem como diretórios independentes em cada armazenamento, mas os diretórios nomeados devem ser vinculados por símbolos de seus respectivos diretórios numerados em storage1 ao diretório numerado correspondente em storage2.

Eu trabalhei em um comando de busca que combina com o que eu quero: find . -type d -mindepth 2 -maxdepth 2 -regextype grep -regex ".*/[0-9]\{1,10\}/.*" que combina com todos estes:

/storage2/123/named_directory_1
/storage2/123456/named_directory_2
/storage2/123456789/named_directory_3

mas não sei como fazer todas as manipulações. algo assim, mas você pode ver que não tenho idéia de como obter $number e $numberandname ... mas tenho experimentado com parâmetros e substituições BASH, mas não consigo acertar.

echo "${named#*/}"
named_directory_1

e este aqui:

echo "${named%/*}"
/storage/123

aqui está o meu melhor esboço de script:

while read -r named; do
export numberandname="${named#/*/*/*/}"
export number="${numberandname%/*}"
    mv -- "$named" "/storage2/$number/"
    ln -s -- "/storage2/$numberandname "$named"
done < <(find /storage1/ -type d -mindepth 2 -maxdepth 2 -regextype grep -regex ".*/[0-9]\{1,10\}/.*")
    
por jakethedog 09.07.2017 / 15:36

1 resposta

1

Eu adicionei algumas melhorias (na minha opinião) ao seu código.

1) Eu usei a opção -printf '%P\n' para o comando find e isso deu caminho sem storage1 part.
 2) Removido export comandos, porque não é necessário aqui.

#!/bin/bash

src_dir="storage1"
dest_dir="storage2"    

nums_and_names=$(find "$src_dir" -type d -mindepth 2 -maxdepth 2 -regextype grep -regex ".*/[0-9]\{1,10\}/.*" -printf '%P\n')

while read -r named; do
    echo mv -- "${src_dir}/$named" "${dest_dir}/${named%/*}"
    echo ln -s -- "${dest_dir}/$named" "${src_dir}/$named" 
done <<< "$nums_and_names"
    
por 09.07.2017 / 19:54