Come far funzionare tar globbing con l'opzione 'cambia directory'


8

Ho la seguente struttura di directory:

base/
   files/
   archives/
   scripts/

Voglio uno script per eseguire da scripts/, Comprimere file che corrispondono results.*.login files/in un gzip tar archivio in archives/.

Sto provando il seguente comando:

tar czfC ../archives/archive.tar.gz ../files results.*.log

Ma capisco

tar: results.*.log: Cannot stat: No such file or directory
tar: Exiting with failure status due to previous errors

Mentre

tar czfC ../archives/archive.tar.gz ../files results.a.log

funziona come previsto. Anche

tar czf ../archives/archive.tar.gz ../files/results.*.log

funziona come vorrei, tranne che aggiunge il prefisso files/al file ed emette anche un avviso:

tar: Removing leading `../' from member names

Quindi la mia conclusione è che il targlobbing non funziona correttamente quando si utilizza l' -Copzione. Qualche consiglio su come faccio a farlo funzionare in modo semplice?

Risposte:


3

Scrivilo nel modo più portatile:

(cd ../files && tar cf - results.*.log) | 
  gzip -9 > ../archives/archive.tar.gz

Il glob verrà comunque interpretato nella directory corrente, prima che ciò cdaccada.
vonbrand,

1
@Vonbrand, no, certo che no. &&è come ;o newline, separa due comandi. È come dire che dopo l'esecuzione cd, qualsiasi glob espanderebbe i file nella directory precedente.
Stéphane Chazelas,

Hai ragione. Non si finisce mai di imparare.
vonbrand,

5

Non c'è "catrame di catrame", il gorgoglio è fatto dal guscio. E la shell non ha idea che tar -C somedirfarà il suo lavoro somedir, eventuali globs vengono espansi nella directory corrente.


Infatti, se results.a.logesiste nella directory da cui viene eseguito lo script, funziona. Ma non capisco perché questo accada, dal momento che -Csta per change directory, quindi la directory corrente dovrebbe essere quella con results.a.log. Non posso accettare la tua risposta perché non offri una soluzione.
Yuval,

2
La shell prende il comando, espande i globs nella directory corrente, produce gli argomenti da quanto sopra e avvia il tarprogramma, che cambia directory molto più tardi. Non riesco a "risolvere" il tuo problema, scusa. L'unica via d'uscita è quella di spostarsi nella directory in cui si desidera glob, oppure eseguire il globbing nella directory e salvare i risultati in un file o una variabile.
vonbrand,

1

Puoi lasciare findfare il globbing e omettere l'opzione 'cambia directory' tarrimuovendo il files/prefisso prima di creare il tarfile.

L' --no-recursionopzione tarè facoltativa poiché nessuna directory verrà archiviata.

cd base/scripts

# gnutar
# printf '%s\000' ../files/results.*.log |  # find alternative
find ../files -maxdepth 1 -type f -name "results.*.log" -print0 | 
   gnutar --transform="s|^\.\{0,1\}\.\{0,1\}/\{0,1\}files/||" -cf - --null --no-recursion -T - | 
   gzip -9 > ../archives/archive.tar.gz
gnutar -tf ../archives/archive.tar.gz | nl
gnutar -xzf ../archives/archive.tar.gz

# bsdtar
find ../files -maxdepth 1 -type f -name "results.*.log" -print0 | 
   bsdtar -s "|^\.\{0,1\}\.\{0,1\}/\{0,1\}files/||" -cf - --null --no-recursion -T - | 
   gzip -9 > ../archives/archive.tar.gz
bsdtar -tf ../archives/archive.tar.gz | nl
bsdtar -xzf ../archives/archive.tar.gz

0

Finalmente l'ho usato

tar czfC ../archives/archive.tar.gz ../files `find ../files/results.*.log -printf "%f\n"`

Anche se potrebbe funzionare per te, è un modo abbastanza complesso per farlo. Inoltre, non funzionerà con nomi di file contenenti caratteri speciali come spazi bianchi. Usa uno dei metodi sani proposti nelle risposte.
Gilles 'SO- smetti di essere malvagio'

0

Il modo per farlo è scrivere qualcosa di simile al seguente:

#!/bin/sh

cd ../files
tar zcf ../archives/archive.tar.gz results.*.log
cd ../scripts

0

Non è il catrame che fa tremare, è il guscio. Prima stai dicendo alla shell di fare globbing, quindi stai dicendo a tar di cambiare directory. Poiché tar sta ricevendo un elenco di nomi di file relativi alle directory originali, questo non funziona.

La soluzione più semplice è di gran lunga lasciare che la shell cambi la directory. interattivo:

cd ../files
tar czf ../archives/archive.tar.gz  results.*.log
cd -

In uno script:

(
  cd ../files &&
    tar czf ../archives/archive.tar.gz  results.*.log
)

o

(
  cd ../files &&
    tar czf -  results.*.log
) >../archives/archive.tar.gz
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.