Como copiar a cabeça dos arquivos para outra pasta, mantendo a estrutura da árvore?

2

Eu tenho um monte de arquivos enormes (4GB + cada) com a mesma extensão em uma estrutura de diretório em uma unidade de rede, mas estou interessado apenas nos primeiros bytes de cada um, então eu gostaria de copiá-los todos para o meu unidade local, com os mesmos nomes de arquivo e mantendo a mesma estrutura de pastas.

Eu tentei:

$ find . -type d -exec mkdir -p ~/Desktop/heads/{} \;
$ find . -type f -name "*.ext" -exec head -c 128 {} > ~/Desktop/heads/{} \;

Mas isso não funciona, já que todos eles são colocados em um arquivo chamado '{}', provavelmente porque o '>' O operador não está sendo interpretado como parte do argumento -exec, e se eu escapar dele com '\ >', então ele escapará para o argumento head, o que também não funciona.

    
por user2986 11.07.2011 / 22:04

2 respostas

1

Você observou corretamente que o problema é o > redirect. Duas soluções:

Use algo assim:

find . -type f -name "*.ext" -exec sh -c "head -c 128 '{}' > ~/Desktop/heads/'{}'" \;

Ou você também pode passar o '{}' como um argumento para o subshell da seguinte forma:

find . -type f -name "*.ext" -exec sh -c 'head -c 128 $1 > ~/Desktop/heads/$1' -- {} \;

O último funciona porque -- {} passa o nome do arquivo como um argumento para sh -c , que pode ser acessado por $1 . Observe que você agora teria que usar aspas simples em ' em vez de aspas duplas.

Atualização: Eu encontrei uma pergunta sobre estouro de pilha que cobre o problema subjacente, usando > dentro de xargs ou comandos semelhantes:

How to use > in an xargs command?

I want to find a bash command that will let me grep every file in a directory and write the output of that grep to a separate file. [...]

    
por 11.07.2011 / 22:41
1

Seu redirecionamento está quebrando. Mude para isto:

$ find . -type d -exec mkdir -p ~/Desktop/heads/{}
$ find . -type f -name "*.ext" -exec sh -c "head -c 128 {} > ~/Desktop/heads/{}" \;
    
por 11.07.2011 / 22:45

Tags