Cara membuat tar globbing berfungsi dengan opsi 'ubah direktori'


8

Saya memiliki struktur direktori followin:

base/
   files/
   archives/
   scripts/

Saya ingin script untuk menjalankan dari scripts/, file kompres yang terkait results.*.logdalam files/menjadi gzip tar arsip di archives/.

Saya mencoba perintah berikut:

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

Tapi saya mengerti

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

Sementara

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

bekerja seperti yang diharapkan. Juga

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

berfungsi seperti yang saya inginkan, kecuali itu menambahkan awalan files/ke file dan juga memancarkan peringatan:

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

Jadi kesimpulan saya adalah bahwa targlobbing tidak berfungsi dengan baik saat menggunakan -Copsi. Adakah saran tentang bagaimana saya membuat pekerjaan ini secara sederhana?

Jawaban:


3

Tulis dengan cara yang lebih portabel:

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

Glob masih akan ditafsirkan dalam direktori saat ini, sebelum cdterjadi.
vonbrand

1
@vonbrand, tidak, tentu saja tidak. &&seperti ;atau baris baru, itu memisahkan dua perintah. Ini seperti mengatakan bahwa setelah dijalankan cd, gumpalan apapun akan memperluas file di direktori sebelumnya.
Stéphane Chazelas

Kamu benar. Seseorang tidak pernah selesai belajar.
vonbrand

5

Tidak ada "tar globbing", globbing dilakukan oleh shell. Dan shell tidak memiliki ide yang tar -C somedirakan melakukan tugasnya somedir, setiap gumpalan diperluas di direktori saat ini.


Memang, jika results.a.logada di direktori tempat skrip dijalankan, ia berfungsi. Tapi saya tidak mengerti mengapa ini terjadi, karena -Csingkatan dari direktori perubahan, jadi direktori saat ini harus menjadi satu dengan results.a.log. Saya tidak dapat menerima jawaban Anda karena Anda tidak menawarkan solusi.
Yuval

2
Shell mengambil perintah, memperluas gumpalan di direktori saat ini, membuat argumen dari yang di atas, dan meluncurkan tarprogram, yang mengubah direktori jauh kemudian. Tidak dapat "menyelesaikan" masalah Anda, maaf. Satu-satunya jalan keluar adalah pindah ke direktori tempat Anda ingin glob, atau lakukan globbing di direktori dan menyimpan hasilnya dalam file atau variabel.
vonbrand

1

Anda dapat membiarkan findmelakukan globbing dan menghilangkan opsi 'direktori perubahan' tardengan menghapus files/awalan sebelum membuat tarfile.

The --no-recursionpilihan untuk taropsional karena tidak ada direktori akan diarsipkan.

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

Akhirnya saya pakai

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

Meskipun itu mungkin berhasil untuk Anda, itu cara yang cukup rumit untuk melakukannya. Selain itu, itu tidak akan berfungsi dengan nama file yang mengandung karakter khusus seperti spasi. Gunakan salah satu metode waras yang telah diajukan dalam jawaban.
Gilles 'SANGAT berhenti menjadi jahat'

0

Cara untuk melakukannya adalah menulis sesuatu seperti berikut:

#!/bin/sh

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

0

Bukan tar yang melakukan globbing, melainkan shell. Anda pertama-tama menyuruh shell untuk melakukan globbing, lalu menyuruh tar untuk mengubah direktori. Karena tar menerima daftar nama file relatif terhadap direktori asli, ini tidak berfungsi.

Solusi termudah sejauh ini adalah membiarkan shell mengubah direktori. Secara interaktif:

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

Dalam naskah:

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

atau

(
  cd ../files &&
    tar czf -  results.*.log
) >../archives/archive.tar.gz
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.