tar -C dengan pola file wildcard

15

Bisakah saya menggunakan perintah tar untuk mengubah direktori dan menggunakan pola file wildcard?

Inilah yang saya coba lakukan:

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

Ini berfungsi jika saya tidak mengubah direktori (-C), tapi saya mencoba menghindari path absolut dalam file tar

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

Berikut adalah beberapa upaya lain yang telah saya lakukan:

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"

Dan ini adalah kesalahan yang saya dapatkan:

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

Saya tahu ada cara lain cara untuk membuat pekerjaan ini (menggunakan find, xargs, dll) tetapi saya berharap untuk melakukan ini hanya dengan perintah tar

Ada ide?

Nick C.
sumber

Jawaban:

16

Masalahnya adalah, * .xml ditafsirkan oleh shell, bukan oleh tar. Oleh karena itu file xml yang ditemukannya (jika ada) ada di direktori tempat Anda menjalankan perintah tar.

Anda harus menggunakan operasi multi-tahap (mungkin melibatkan pipa) untuk memilih file yang Anda inginkan dan kemudian tar.

Cara termudah adalah dengan melakukannya cd ke dalam direktori di mana file berada:

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

harus bekerja.

Kurung mengelompokkan perintah-perintah bersama, jadi setelah selesai Anda masih akan berada di direktori asli Anda. & Amp; & amp; berarti tar hanya akan berjalan jika inisial cd berhasil.

Majenko
sumber
8

Dalam salah satu upaya Anda:

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

karakter * memang diteruskan ke tar. Masalahnya, bagaimanapun, adalah bahwa tar hanya mendukung pencocokan wildcard pada nama-nama anggota arsip. Jadi, selagi Anda bisa menggunakan wildcard saat mengekstraksi atau mendaftar anggota dari arsip, Anda tidak bisa menggunakan wildcard saat membuat arsip.

Dalam situasi seperti itu sering saya resor untuk menemukan (seperti yang sudah Anda sebutkan). Jika Anda menemukan GNU, ia memiliki opsi yang bagus untuk mencetak hanya jalur relatif, menggunakan opsi -printf:

find '/path/to/file' -maxdepth 1 -name '*.xml' -printf '%P\0' \
| tar --null -C '/path/to/file' --files-from=- -cf 'example.tar'
gaston
sumber