![usando find, exec e cp para copiar arquivos específicos enquanto preserva o caminho do diretório](https://rvso.com/image/747354/usando%20find%2C%20exec%20e%20cp%20para%20copiar%20arquivos%20espec%C3%ADficos%20enquanto%20preserva%20o%20caminho%20do%20diret%C3%B3rio.png)
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.txt
ocorreu. Alguém pode me explicar por que isso aconteceu e como posso corrigir meu comando de forma que temp
nã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/s
está no find
caminho de pesquisa de , find
está listando arquivos, enquanto os cp
s 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 cp
processos.