Quero copiar parte de uma origem para um destino:
SRC_DIR=/a/b/c/d/e
DEST_DIR=/x/y/z/d/e
Quando meu script é iniciado, crio todas as pastas em $DEST_DIR
:
mkdir -pv /x/y/z/d/e
Eu tenho uma lista de caminhos relativos da fonte que são os primeiros filhos que e
desejo copiar. Esta lista é construída a partir da saída de um comando find e se parece com:
/USER_CONFIG_COPY/G731GV/REAL/2023_06_17_22h11/user_install/root
....
....
/002_DATA/SSH/2023_09_01.prev/root
....
....
....
/002_DATA/USER_CONFIG_INITIAL/root
....
....
....
....
/001_SCRIPTS/000_TOOLS/root
....
....
Para construir a lista Include, primeiro coloco a pasta pai e depois a lista obtida na saída find. Então a lista fica assim:
/a
/a/b
/a/b/c
/a/b/c/d
/a/b/c/d/e
/USER_CONFIG_COPY/G731GV/REAL/2023_06_17_22h11/user_install/root
....
....
/002_DATA/SSH/2023_09_01.prev/root
....
O comando final é:
rsync -arzh -vvv --include='/tmp/000_my_include_root_dirlist.txt' --exclude='*' "$SRC_DIR/" "$DST_DIR/"
Tentei muitas dicas encontradas no U&L Stack Exchange sem sucesso. O que estou fazendo de errado?
Ok, a sugestão do Chris funciona em um pequeno conjunto de pastas. Meu problema vem de uma opção --recursive ausente e de um problema ao usar sticky bit nas pastas. Vou fazer um teste completo. Dou notícias o mais rápido possível.
Sua opção
--include='/tmp/000_my_include_root_dirlist.txt'
inclui o arquivo"$SRC_DIR/tmp/000_my_include_root_dirlist.txt"
, não seu conteúdo. Você provavelmente quer--files-from
e--include
nem--exclude
:Agora remova o primeiro conjunto de
/a
through to/a/b/c/d/e
da sua lista de arquivos e certifique-se de que o restante dos arquivos listados tenham caminhos relativos a$SRC_DIR
, um por linha. Por exemplo,/my_file.txt
para representar"$SRC_DIR/my_file.txt"
.Eu adicionei
--dry-run
para quersync
apenas mostre o que vai fazer. Remova essa opção quando estiver pronto para executá-la. Também removi o redundante-r
porque faz parte-a
e-z
porque é inútil ao copiar localmente.Também estou um pouco confuso por que você parece querer gerar uma lista de arquivos a serem copiados quando
rsync
puder fazer isso sozinho. (Talvez você tenha aplicado algum outro critériofind
que restrinja o conjunto de arquivos?)Se, como você diz,
USER_CONFIG_COPY
,002_DATA
e001_SCRIPTS
são subdiretórios dee
, então você não deve colocar/
na frente deles (por exemplo,/USER_CONFIG_COPY
). “/USER_CONFIG_COPY
” indica umUSER_CONFIG_COPY
diretório no diretório raiz .Se você
cd
executar/a/b/c/d/e
e executarfind
, obterá uma saída semelhante aOs
.
s no início não são decoração; você não pode simplesmente deixá-los desligados. Eles indicam que os caminhos são relativos ao.
diretório atual (que é/a/b/c/d/e
).Da mesma forma, se você executar , obterá uma saída semelhante a
find "$SRC_DIR/" criteria
Se você canalizar isso
sed 's#^'$PATH_INCLUDE_FROM'##'
, assumindo$PATH_INCLUDE_FROM
que é/a/b/c/d/e
, você também obterá a saída que mostrou. E é igualmente errado. Se quiser fazer referência/a/b/c/d/e/USER_CONFIG_COPY/...
, não é correto colocar/a/b/c/d/e
em uma linha e/USER_CONFIG_COPY/...
na próxima. Cada linha deve ser um nome de arquivo válido.Por falar nisso,
SRC_DIR
ePATH_INCLUDE_FROM
) para se referir ao mesmo diretório?'s#^'$PATH_INCLUDE_FROM'##'
é uma sintaxe ruim. Use"s#^$PATH_INCLUDE_FROM##"
(com aspas duplas,"
) em vez disso.