Diretório Rsync filtrando arquivos e retendo casos de borda (por exemplo, nomes com caracteres h / h (-))

1

Eu tenho uma pasta de teste com a seguinte estrutura:

"driveA"
  - "bar - foo"
    - "fileBarFooA"
    - "fileBarFooB"
  - "fileA"
  - "fileB"
  - "fileC"
  - "folder.A"
    - "fileAA"
    - "fileAB"
  - "folderB"
    - "fileBA"
    - "fileBB"

Dentro de um shell bash, eu quero rsync o conteúdo da driveA em driveB EXCEPT para a pasta "folder.A", para obter uma cópia resultante que se pareça com:

"driveB"
  - "bar - foo"
    - "fileBarFooA"
    - "fileBarFooB"
  - "fileA"
  - "fileB"
  - "fileC"
  - "folderB"
    - "fileBA"
    - "fileBB"

À primeira vista, uma abordagem para fazer isso é fornecer um ls filtrado na unidade A como um argumento para o rsync:

rsync -aR -- 'ls -F | grep [^folder.A/]' ../driveB

Isso resulta em erros e não é concluído:

Oproblemaéqueapasta"bar-foo" não é copiada. Analisando o erro, vemos que um problema é que estamos alimentando ls -F , o que resulta na saída não escapada de nomes de arquivos e pastas:

:driveA$ ls -F
bar - foo/  
fileA       
fileB       
fileC
folder.A/
folderB/

Eu não encontrei uma opção em ls para fazer a saída com caracteres de escape, então a próxima coisa a tentar é o pós-processamento com sed - uma maneira é adicionar chars de escape:

:driveA vgani$ ls -F | sed 's/\ /\\ /g' | grep [^folder.A/]
bar\ -\ foo/
fileA
fileB
fileC
folderB/

Rsyncing com isso nos dá:

:driveA $ rsync -aR 'ls -F | sed 's/\ /\\ /g' | grep [^folder.A/]' ../driveB
rsync: -\: unknown option
rsync error: syntax or usage error (code 1) at /BuildRoot/Library/Caches/com.apple.xbs/Sources/rsync/rsync-51/rsync/main.c(1337) [client=2.6.9]

Ah, não, um erro (e um 1337 um!) Isso se deve ao fato de o rsync ter a parte -\ da pasta como um argumento de linha de comando, então podemos corrigir isso adicionando -- :

driveA $ rsync -aR -- 'ls -F | sed 's/\ /\\ /g' | grep [^folder.A/]' ../driveB

Assim,pareceomesmoresultadoquenemseincomodaemadicionarcaracteresdeescape.

Outraideiadepós-processamentoseriatentaradicionaraspas:

:driveA$ls-F|sed's/^/"/g' | sed 's/[^/]$/"/g' | sed 's/\//"\//g'
"bar - foo"/
"file"
"file"
"file"
"folder.A"/
"folderB"/

Mas isso leva ao rsync tratando as citações como caracteres literais e copia nada:

:driveA $ rsync -aR -- 'ls -F | sed 's/^/"/g' | sed 's/[^/]$/"/g' | sed 's/\//"\//g' | grep [^\"folder.A\"/]' ../driveB
rsync: link_stat "/driveA/"bar" failed: No such file or directory (2)
rsync: link_stat "/driveA/-" failed: No such file or directory (2)
rsync: link_stat "/driveA/foo"/" failed: No such file or directory (2)
rsync: link_stat "/driveA/"file"" failed: No such file or directory (2)
rsync: link_stat "/driveA/"file"" failed: No such file or directory (2)
rsync: link_stat "/driveA/"file"" failed: No such file or directory (2)
rsync: link_stat "/driveA/"folderB"/" failed: No such file or directory (2)
rsync error: some files could not be transferred (code 23) at /BuildRoot/Library/Caches/com.apple.xbs/Sources/rsync/rsync-51/rsync/main.c(996) [sender=2.6.9]

Até agora eu estou perplexo, existe uma maneira de alimentar rsync conteúdo de ls sem engasgar com caracteres de hífen?

    
por Vivek Gani 13.11.2016 / 01:33

1 resposta

1

O rsync tem uma opção exclude . Você deve conseguir isso com:

cd /path/to/driveA
rsync -avWxP --exclude=folder.A . /path/to/driveB/
    
por 13.11.2016 / 01:36

Tags