usando find, exec e cp para copiar arquivos específicos enquanto preserva o caminho do diretório

usando find, exec e cp para copiar arquivos específicos enquanto preserva o caminho do diretório

Configurei as seguintes pastas com arquivos de texto vazios:

1/a.txt
2/b.txt

Quero copiar apenas arquivos txt para outro diretório, mantendo sua estrutura de diretórios. Então tentei os seguintes comandos:

mkdir -p temp/s;
find ./ -name '*txt' -exec cp --parents '{}' ./temp/s \;

Agora vejo os seguintes arquivos do meu diretório atual:

1/a.txt
2/b.txt
temp/s/1/a.txt
temp/s/2/b.txt
temp/s/temp/s/2/b.txt

Não entendo por que a linha final temp/s/temp/s/2/b.txtocorreu. Alguém pode me explicar por que isso aconteceu e como posso corrigir meu comando de forma que tempnão esteja aninhado em outro temp?

Este é o resultado final que eu esperava:

1/a.txt
2/b.txt
temp/s/1/a.txt
temp/s/2/b.txt

Responder1

Você tem umcondição de corrida: já que temp/sestá no findcaminho de pesquisa de , findestá listando arquivos, enquanto os cps gerados estão adicionando novos arquivos.

Você deve excluir o subdiretório durante a execução find:

find . -path ./temp/s -prune -o -name '*txt' -exec cp --parents '{}' ./temp/s \;

Observe que substituir \;por +gerará muito menos cpprocessos.

informação relacionada