Eu te imploro, passo de expansão shell simples na cplinha de comando - expansão shell tem todos os tipos de ahem . Casos de canto "interessantes" (recursão indesejados causados por e .., espaços, coisas não-imprimíveis, hardlinks, links simbólicos, e etc.) Use em findvez disso (ele vem no findutilspacote, caso você não o tenha instalado - o que seria estranho, todas as distribuições o instalam por padrão):
find -H /path/to/toplevel/dir/ -maxdepth 1 -name '.*' -a \( -type d -o -type f -o -type l \) -exec cp -a '{}' /path/to/destination/dir/ \;
Explicação passo a passo:
-H vai causar find não siga os links simbólicos (exceto se o nome do diretório real de nível superior que você deu for um link simbólico; que será seguido.)
/path/to/toplevel/dir/ é, obviamente, suposto ser substituído por você pelo caminho do diretório que hospeda os arquivos de configuração e os diretórios que você deseja fazer backup.
-maxdepth 1 Vai parar find de recursivamente descer para qualquer diretório cujo nome comece com um ponto. Não precisamos recursar, cpfaremos isso por nós, só precisamos dos nomes nesse nível.
-name '.*'diz findque queremos todos os nomes que começam com um ponto. Isso não funcionará corretamente se a variável de ambiente POSIXLY_CORRECTestiver definida, mas raramente (se houver). Essa é a primeira condição de correspondência especificada até o momento.
a \( ....... \)é um e seguido por uma condição mais complexa entre parênteses (usei ..... para substituí-lo, é explicado abaixo.) Precisamos escapar dos parênteses, pois, caso contrário, eles serão (mis) interpretados pelo shell, daí a barra invertida na frente deles,
-type d -o -type f -o -type lsão três condições com um ou entre eles. -type dcorresponde aos diretórios, -type faos arquivos regulares e aos -type llinks simbólicos. Você pode selecionar o que deseja - por exemplo, se não desejar fazer backup dos diretórios de configurações, omita-type d (e -ologo atrás, obviamente).
-exec ..... \;diz findpara executar um comando toda vez que uma correspondência é encontrada. O final do comando é marcado por um ponto e vírgula, do qual precisamos escapar novamente com uma barra invertida para evitar a interpretação da shell. Dentro dessa linha de comando, você precisa usar {}onde deseja que o nome da correspondência encontrada atualmente termine. Como os escudos também podem interpretar mal o aparelho, você deve colocá-los em apóstrofos, como em '{}'. O comando que queremos executar neste caso é cp -a '{}' /path/to/destination/dir/(-a significa archive, que se repete em subdiretórios, copia links simbólicos como links e preserva permissões e atributos estendidos, e /path/to/destination/dir/obviamente é o nome do diretório de destino - substitua-o.)
Portanto, em inglês simples, esta findlinha de comando diz o seguinte:
Comece em / path / to / toplevel / dir /. Não desça em nenhum subdiretório. Encontre todos os diretórios, arquivos e links simbólicos cujo nome comece com um ponto. Para cada um dos encontrados, copie-o para / path / to / destination / dir / preservando a natureza, permissões e atributos estendidos.
-re-R?