tar um número específico de arquivos listados em um arquivo de texto

2

Eu tenho um arquivo de texto que contém uma lista de arquivos.

eu uso.

tar --null --no-recursion -uf abc.tar --directory= /tmp/temp --files-from abc.txt

Este comando simplesmente cria um tar com todos os arquivos listados no arquivo de texto.

Existe alguma maneira em que posso tar apenas o número selecionado de arquivos da lista? Digamos, por exemplo, apenas os primeiros 50 arquivos listados no arquivo de texto.

    
por Mano 05.08.2013 / 06:22

4 respostas

1

Você pode tentar algo como: ( Atualizado para permitir espaços em branco nos nomes dos arquivos )

head -50 abc.txt | tr "\n" "
head -50 abc.txt | tr "\n" "%pre%" | xargs -0 tar --null -no-recursion -uf abc.tar --directory=/tmp/temp
" | xargs -0 tar --null -no-recursion -uf abc.tar --directory=/tmp/temp

O comando head -50 fornecerá as primeiras 50 linhas do arquivo de lista. Esse resultado é canalizado em | para tr . Basicamente, tr executará uma operação de conversão, substituindo os caracteres de nova linha \n por um caractere nulo xargs -0 . O resultado é canalizado para tar , que converterá todas essas linhas em argumentos para o comando -0 . Os argumentos xargs para %code% separam os argumentos com base em caracteres nulos em vez de espaços em branco. Isso fará com que o comando funcione mesmo que seus nomes de arquivos tenham espaços.

Obrigado a Jordanm por seu comentário.

    
por 05.08.2013 / 06:43
1

Você pode usar head ou tail para controlar o número de arquivos que você está limitando do arquivo abc.txt .

Exemplo

Exemplo de arquivo abc.txt .

$ cat abc.txt
afile1
afile10
afile2
afile3
afile4
afile5
afile6
afile7
afile8
afile9

Agora, vamos adicionar apenas os primeiros 3 arquivos de abc.txt :

$ head -3 abc.txt | tr '\n' '
$ tar tvf abc.tar 
-rw-rw-r-- saml/saml         0 2013-08-05 13:24 afile1
-rw-rw-r-- saml/saml         0 2013-08-05 13:24 afile10
-rw-rw-r-- saml/saml         0 2013-08-05 13:24 afile2
' | tar --null --no-recursion -uf abc.tar -T -

O exemplo acima leva a saída de head ... , converte os caracteres de fim de linha ( \n ) em caracteres nulos ( -T - ). Esta saída é então canalizada para tar, que a leva através de STDIN, ( tar ). Este último bit diz tar para tomar STDIN como entrada, esta é a lista de nomes de arquivos para abc.tar .

Confirmação de head -3 ... :

$ cat abc.txt
afile1
afile10
afile2
afile3
afile4
afile5
afile6
afile7
afile8
afile9

Você pode mudar o código acima de for example, to get the 1st 100. Or you could use para head -100 ... %code% tail -100 ... 'para obter as últimas 100 no arquivo.

    
por 05.08.2013 / 19:56
0

Inspirado no comentário de jordanm sobre a resposta de Bichoy, veja como você pode lidar com nomes de arquivos com espaços neles:

count=50
i=1
while [ $i -le $count ]
do
    read filename
    tar --null -no-recursion -ruf abc.tar "$filename" --directory=/tmp/temp
    i=$(($i+1))
done <abc.txt

Eu usei um loop while em vez de fazer for i in {1..50} para permitir que você codifique o número de linhas necessárias.

    
por 05.08.2013 / 08:03
0

Se tiver certeza de que não há novas linhas em seus nomes de arquivos, converta os bytes nulos em novas linhas e chame head para reter apenas as primeiras linhas.

<abc.txt tr '
<abc.txt tr '
<abc.txt tr '
<abc.txt tr '%pre%\n' '\n%pre%' |
head -n 50 |
tr '%pre%\n' '\n%pre%' |
tar --null --no-recursion -uf abc.tar --directory= /tmp/temp --files-from -
' '\n' | head -n 50 | tar --null --no-recursion -uf abc.tar --directory= /tmp/temp --files-from -
\n' '\n%pre%' | head -n 50 | tr '%pre%\n' '\n%pre%' | tar --null --no-recursion -uf abc.tar --directory= /tmp/temp --files-from -
' '\n' | head -n 50 | tar --null --no-recursion -uf abc.tar --directory= /tmp/temp --files-from -

Para lidar com nomes de arquivos que contêm novas linhas, você pode transpor novas linhas e valores nulos, depois deixar head em suas coisas e transpor de volta.

%pre%     
por 06.08.2013 / 03:36

Tags