Substituição de comandos grepping ls output provoca erro

1

Estou tentando fazer um arquivo tar.tgz usando a substituição de comandos

Existem backups de 17 de agosto de 2012

-rw-r----- 1 ossec  502 804M Aug 17  2012 BKPMDISINT_i6nir20j.F_bkp
-rw-r----- 1 ossec  502 2.7G Aug 17  2012 BKPSYFINT_i5nir20j.F_bkp
-rw-r----- 1 ossec  502 3.9G Aug 17  2012 BKPMSFFINT_i4nir20j.F_bkp
-rw-r----- 1 ossec  502  28M Aug 17  2012 c-651746692-20120817-00
-rw-r----- 1 ossec  502 2.0G Aug 17  2012 ALG_KLPFINT_ianir576.alg
-rw-r----- 1 ossec  502 1.5G Aug 17  2012 ALG_KLPFINT_i8nir576.alg
-rw-r----- 1 ossec  502  37M Aug 17  2012 ALG_KLPINT_ibnir64h.alg
-rw-r----- 1 ossec  502 2.2G Aug 17  2012 ALG_KLPFINT_i9nir576.alg
-rw-r----- 1 ossec  502  28M Aug 17  2012 c-651746692-20120817-01
-rw-r----- 1 ossec  502  27M Aug 17  2012 ctrl_170803

Então eu preciso tar-los. Eu usei este comando

tar -zcvf DB-Backup-17082012.tgz $(ls -lrth|grep "Aug 17")

Mas isso me deu esse erro

tar: You may not specify more than one '-Acdtrux' option
Try 'tar --help' or 'tar --usage' for more information.
    
por OmiPenguin 26.06.2013 / 16:05

4 respostas

3

Seu caminho

Você pode certamente fazer o que quiser, mas provavelmente é perigoso, pois alguns arquivos podem ter espaços em seus nomes. Aqui está uma maneira de fazer isso.

$ tar -zcvf DB-Backup-17082012.tgz $(ls -lrth|grep "Aug 17"|awk '{print $9}')

Isso eliminará todos os dados da coluna que você está obtendo do ls -lrth e apenas fornecerá os nomes dos arquivos.

Usando o Localizar & tar: método # 1

Você pode usar o comando Unix find para obter uma lista de todos os arquivos que foram modificados pela última vez em uma determinada data e canalizar essa lista para tar da seguinte forma:

$ find . -type f -newermt 2012-08-17 ! -newermt 2012-08-18 -print0 | \
   xargs -0 tar zcvf DB-Backup-17082012.tgz

Os itens acima só encontrarão arquivos que foram modificados pela última vez em 2012-08-17, mas nada de mais recente. O -print0 informa para dividir os arquivos que ele gera usando caracteres nulos ( xargs -0 ) e o tar pega cada um desses arquivos e cria invocações de tar adicionando os arquivos em lotes de cada vez.

Esta é provavelmente a maneira menos eficiente de fazer isso.

OBSERVAÇÃO: Esse método também corre o risco de perder arquivos se você tiver mais que argumentos de linha de comando para o comando -print0 .

Usando o Localizar & tar: método # 2

O xargs -0 e o find são redundantes e você pode usar apenas tar para gerar a lista e chamar {} \+ diretamente:

$ find . -type f -newermt 2012-08-17 ! -newermt 2012-08-18 \
   -exec tar zcvf DB-Backup-17082012.tgz {} \+

Os argumentos {} para encontrar acima farão duas coisas. O find substituirá o nome de cada arquivo, pois tar o encontrará nessa posição ao chamar \+ e find informar tar a continuar colocando quantos arquivos puder na linha de comando antes de chamar% código%. Isso evita que você invoque tar 100 vezes se tiver 100 arquivos para adicionar a ele.

Referências

por 26.06.2013 / 23:05
7

Se você $(ls -lrth|grep "Aug 17") obtiver a linha inteira, não apenas os nomes de arquivos como argumento para tar , isso não funcionará. Em geral, você deve não analisar a saída de ls .

O que você pode fazer se tiver uma versão relativamente recente do Gnu find (> = v4.3.3) é

find . -maxdepth 1 -newermt 20120817T0000 -not -newermt 20130818T0000 -print0 \
    | cpio --create --null  --format=ustar \
    | gzip > DB-Backup-17082012.tgz

Se o seu find não der suporte a -newermt , você poderá criar dois arquivos com contato com esses carimbos de data e apenas usar -newer. Claro que você também pode usar -daystart -mtime , mas você precisaria calcular o número de dias (ou usar tentativa e erro).

Uma recomendação que tenho é usar datas em arquivos no formato AAAAMMDD. Primeiro do tipo melhor se você tiver vários arquivos que começam com a mesma seqüência até a data e segundo algo como 05062012 seria ambíguo dependendo da pessoa que olha o nome do arquivo (5 de junho (Europa) ou 6 de maio (EUA)) . Então, embora 1708 deva ser 17 de agosto, eu chamaria o arquivo DB-Backup-20120817.tgz

    
por 26.06.2013 / 17:00
0

Seu formato atual ls|grep "Aug 17" não produz nada. Em vez disso, use o seguinte formato:

$ ls -ltr  | grep 'Aug 17'
    
por 26.06.2013 / 16:16
0

sobre a linha $(ls -lrth|grep "Aug 17") this awk provavelmente extrairia as datas desejadas:

$(ls -lrth|awk '/Aug/&&/17{print $0}')
    
por 26.06.2013 / 20:04