O rsync tem uma opção exclude
. Você deve conseguir isso com:
cd /path/to/driveA
rsync -avWxP --exclude=folder.A . /path/to/driveB/
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?