Eu tenho esse script que tenho usado há algum tempo e funciona principalmente, mas há alguns problemas que eu gostaria de receber ajuda para corrigir.
O objetivo é observar um ponto de montagem externo, verificar a presença de diretórios de origem correspondentes e, se correspondente, remover a origem e criar um link simbólico do ponto externo para o local vazio onde estava a origem.
É claro que qualquer sugestão sobre melhores formas de alcançar a mesma tarefa seria muito bem-vinda.
O primeiro e mais significativo problema é que alguns diretórios são deixados para trás. Olhando através deles, não consigo ver nenhum padrão específico. Muitos têm {}
ou outros caracteres especiais e acho que esta pode ser a causa principal, mas alguns são muito baunilha, sem caracteres especiais.
Segundo, meu script não leva em conta os arquivos, onde espera um diretório.
A estrutura é assim:
19823798/Test1 (789) - {456} [123]
8765862/Test2 {123} - (456) [789]
345345/Test2-ünicode (456) - {789} [123]
308/unexpected.file
e meu script é assim:
#!/bin/bash
set -e
src_dir="/var/tank"
dest_dir="/mnt/tank"
nums_and_names=$(find "$src_dir" -mindepth 2 -maxdepth 2 -type d -regextype grep -regex ".*/[0-9]\{1,10\}/.*" -printf '%P\n')
while read -r named; do
echo "dest_dir is "${dest_dir}/$named""
echo "find output is $named"
[ -d "${dest_dir}/$named" ] && echo ""${dest_dir}/$named" exists!" || exit 0
rm -rf -- "${src_dir}/$named"
ln -s -- "${dest_dir}/$named" "${src_dir}/$named"
done <<< "$nums_and_names"
echo "all finished"
Tags bash symlink shell-script