tar -C con un modello di file jolly


17

Posso usare il comando tar per cambiare directory e usare un modello di file jolly?

Ecco cosa sto cercando di fare:

tar -cf example.tar -C /path/to/file *.xml

Funziona se non cambio directory (-C), ma sto cercando di evitare percorsi assoluti nel file tar.

tar -cf example.tar /path/to/file/*.xml

Ecco alcuni degli altri tentativi che ho fatto:

tar -cf example.tar -C /path/to/file *.xml
tar -cf example.tar -C /path/to/file/ *.xml
tar -cf example.tar -C /path/to/file/ ./*.xml
tar -cf example.tar -C /path/to/file "*.xml"

E questo è l'errore che ottengo:

tar: *.xml: Cannot stat: No such file or directory

So che ci sono altri modi per farlo funzionare (usando find, xargs, ecc.) Ma speravo di farlo solo con il comando tar.

Qualche idea?

Risposte:


18

Il problema è che * .xml viene interpretato dalla shell, non da tar. Pertanto i file xml che trova (se presenti) si trovano nella directory in cui è stato eseguito il comando tar.

Dovresti usare un'operazione a più stadi (magari coinvolgendo le pipe) per selezionare i file che vuoi e poi tararli.

Il modo più semplice sarebbe quello di accedere alla cddirectory in cui si trovano i file:

$ (cd /path/to/file && tar -cf /path/to/example.tar *.xml)

dovrebbe funzionare.

Le parentesi raggruppano i comandi insieme, quindi una volta terminato sarai ancora nella directory originale. && indica che tarverrà eseguito solo se l'iniziale ha cdavuto esito positivo.


9

In uno dei tuoi tentativi:

tar -cf example.tar -C /path/to/file "*.xml"

il carattere * viene effettivamente passato a tar. Il problema, tuttavia, è che tar supporta solo la corrispondenza dei caratteri jolly sui nomi dei membri di un archivio. Pertanto, mentre è possibile utilizzare i caratteri jolly durante l'estrazione o l'elenco dei membri da un archivio, non è possibile utilizzare i caratteri jolly durante la creazione di un archivio.

In tali situazioni spesso ricorro a trovare (come hai già detto). Se hai GNU find, ha la simpatica opzione per stampare solo il percorso relativo, usando l'opzione -printf:

find '/path/to/file' -maxdepth 1 -name '*.xml' -printf '%P\0' \
| tar --null -C '/path/to/file' --files-from=- -cf 'example.tar'
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.