Tudo bem, problema tão simples aqui. Estou trabalhando em um código de backup simples. Funciona bem, exceto se os arquivos contiverem espaços. É assim que encontro arquivos e os adiciono a um arquivo tar:
find . -type f | xargs tar -czvf backup.tar.gz
O problema é quando o arquivo tem um espaço no nome porque o tar pensa que é uma pasta. Basicamente, há uma maneira de adicionar aspas em torno dos resultados de find? Ou uma maneira diferente de consertar isso?
find ... | xargs ...
é usar o / -0 parâmetro -print0 em cada:find -print0 ... | xargs -0 ...
. Isso fará com que os nomes dos arquivos sejam separados por um caractere nulo, o que significa que você pode ter espaços ou novas linhas ou outras coisas estranhas em seus nomes de arquivo e ainda funcionará.Respostas:
Usa isto:
Será:
tar -c
comxargs
fará quando você tiver um grande número de arquivosVeja também:
fonte
-print0
aplica-se apenas à última expressão. Exfind . \( -type f -o -name '*.c' \) -print0 | ...
c:\cygwin\bin\find . -regextype posix-egrep -regex '.*(sln^|vcxproj^|filters)$' -print0 | c:\cygwin\bin\tar -cvf MS_Projects.tar --null -T -
-T
, e significa ler os nomes dos arquivos da entrada padrão: Se você fornecer um único traço como um nome de arquivo para `--files-from ', (ou seja, você especifica --files-from = - ou -T -), então os nomes dos arquivos são lidos a partir da entrada padrãoPode haver outra maneira de conseguir o que você deseja. Basicamente,
Em seguida, tar com a opção -T que permite obter uma lista de locais de arquivos (aquele que você acabou de criar com find!)
fonte
Tente executar:
fonte
Por que não:
Claro, é inteligente usar find e depois xargs, mas você está fazendo isso da maneira mais difícil.
Atualização: Porges comentou com uma opção de localização que eu acho que é uma resposta melhor do que a minha, ou a outra:
find -print0 ... | xargs -0 ....
fonte
xargs ... tar c ...
irá sobrescrever o primeiro arquivo criado se a lista de arquivos for muito longa exargs
será executadotar
pela segunda vez! Para evitar a substituição, você pode usar,xargs -x
mas o arquivo pode estar incompleto. A alternativa pode ser primeirotar c ...
e depois, possivelmente, repetidamentetar r ...
. (minha contribuição para a confiabilidade :)Se você tiver vários arquivos ou diretórios e quiser compactá-los em um
*.gz
arquivo independente, poderá fazer isso. Opcional-type f -atime
Isso vai comprimir
para
fonte
Por que não experimentar algo assim:
tar cvf scala.tar `find src -name *.scala`
fonte
Outra solução como vista aqui :
fonte
Gostaria de adicionar um comentário ao post de @Steve Kehlet, mas precisa de 50 representantes (RIP).
Para qualquer pessoa que encontrou esta postagem por meio de várias pesquisas no Google, encontrei uma maneira de não apenas encontrar arquivos específicos em um intervalo de tempo, mas também NÃO incluir os caminhos relativos OU espaços em branco que causariam erros de tarring. (MUITO OBRIGADO, STEVE.)
.
diretório relativo-name "*.pdf"
procure pdfs (ou qualquer tipo de arquivo)-type f
o tipo a procurar é um arquivo-mtime 0
procure os arquivos criados nas últimas 24 horas-printf "%f\0"
Regular-print0
OU-printf "%f"
NÃO funcionou para mim. Das páginas de manual:-czvf
criar arquivo, filtrar o arquivo através do gzip, listar detalhadamente os arquivos processados, nome do arquivoEditar 14-08-2019: gostaria de acrescentar que também fui capaz de usar essencialmente o mesmo comando em meu comentário, apenas usando o próprio tar:
Necessário
--ignore-failed-read
no caso de não haver novos PDFs para hoje.fonte
A melhor solução parece ser criar uma lista de arquivos e, em seguida, arquivá-los, porque você pode usar outras fontes e fazer outra coisa com a lista.
Por exemplo, isso permite usar a lista para calcular o tamanho dos arquivos que estão sendo arquivados:
fonte