Eu te imploro, passo de expansão shell simples na cp
linha 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 find
vez disso (ele vem no findutils
pacote, 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, cp
faremos isso por nós, só precisamos dos nomes nesse nível.
-name '.*'
diz find
que queremos todos os nomes que começam com um ponto. Isso não funcionará corretamente se a variável de ambiente POSIXLY_CORRECT
estiver 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 l
são três condições com um ou entre eles. -type d
corresponde aos diretórios, -type f
aos arquivos regulares e aos -type l
links 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 -o
logo atrás, obviamente).
-exec ..... \;
diz find
para 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 find
linha 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.
-r
e-R
?