Baiklah, masalah sangat sederhana di sini. Saya sedang mengerjakan kode cadangan sederhana. Ini berfungsi dengan baik kecuali jika file memiliki spasi di dalamnya. Beginilah cara saya menemukan file dan menambahkannya ke arsip tar:
find . -type f | xargs tar -czvf backup.tar.gz
Masalahnya adalah ketika file memiliki spasi di nama karena tar mengira itu folder. Pada dasarnya, apakah ada cara agar saya dapat menambahkan kutipan di sekitar hasil dari pencarian? Atau cara lain untuk memperbaikinya?
find ... | xargs ...
adalah dengan menggunakan -print0 / -0 parameter pada setiap:find -print0 ... | xargs -0 ...
. Ini akan menyebabkan nama file dipisahkan oleh karakter null, yang berarti Anda dapat memiliki spasi atau baris baru atau hal aneh lainnya di nama file Anda dan itu akan tetap berfungsi.Jawaban:
Gunakan ini:
Itu akan:
tar -c
withxargs
akan dilakukan ketika Anda memiliki banyak fileLihat juga:
sumber
-print0
berlaku untuk ekspresi terakhir. Misalnyafind . \( -type f -o -name '*.c' \) -print0 | ...
c:\cygwin\bin\find . -regextype posix-egrep -regex '.*(sln^|vcxproj^|filters)$' -print0 | c:\cygwin\bin\tar -cvf MS_Projects.tar --null -T -
-T
, dan itu berarti membaca nama file dari input standar: Jika Anda memberikan satu tanda hubung sebagai nama file untuk `--files-from ', (yaitu, Anda menentukan --files-from = - atau -T -), maka nama file dibaca dari input standarMungkin ada cara lain untuk mencapai apa yang Anda inginkan. Pada dasarnya,
Kemudian tar dengan opsi -T yang memungkinkannya untuk mengambil daftar lokasi file (yang baru saja Anda buat dengan find!)
sumber
Coba jalankan:
sumber
Kenapa tidak:
Tentu pintar menggunakan find dan kemudian xargs, tetapi Anda melakukannya dengan cara yang sulit.
Pembaruan: Porges telah berkomentar dengan opsi temukan yang menurut saya merupakan jawaban yang lebih baik daripada jawaban saya, atau yang lain:
find -print0 ... | xargs -0 ....
sumber
xargs ... tar c ...
akan menimpa arsip pertama yang dibuat jika daftar file terlalu panjang danxargs
akan dijalankantar
untuk kedua kalinya! Untuk menghindari penimpaan, Anda dapat menggunakanxargs -x
tetapi arsipnya mungkin tidak lengkap. Alternatifnya bisa pertamatar c ...
dan kemudian mungkin berulang kalitar r ...
. (kontribusi saya untuk keandalan :)Jika Anda memiliki banyak file atau direktori dan Anda ingin meng-zip-nya menjadi
*.gz
file independen, Anda dapat melakukan ini. Pilihan-type f -atime
Ini akan memampatkan
untuk
sumber
Mengapa tidak mencoba sesuatu seperti ini:
tar cvf scala.tar `find src -name *.scala`
sumber
Solusi lain seperti yang terlihat di sini :
sumber
Akan menambahkan komentar ke postingan @Steve Kehlet tetapi membutuhkan 50 rep (RIP).
Bagi siapa pun yang telah menemukan posting ini melalui banyak googling, saya menemukan cara untuk tidak hanya menemukan file tertentu yang diberikan rentang waktu, tetapi juga TIDAK menyertakan jalur relatif ATAU spasi yang akan menyebabkan kesalahan tarring. (TERIMA KASIH BANYAK STEVE.)
.
direktori relatif-name "*.pdf"
cari pdf (atau jenis file apa pun)-type f
jenis yang dicari adalah file-mtime 0
cari file yang dibuat dalam 24 jam terakhir-printf "%f\0"
Biasa-print0
ATAU-printf "%f"
TIDAK berhasil untuk saya. Dari halaman manual:-czvf
buat arsip, filter arsip melalui gzip, daftar file yang diproses secara verbal, nama arsipSunting 2019-08-14: Saya ingin menambahkan, bahwa saya juga dapat menggunakan pada dasarnya menggunakan perintah yang sama di komentar saya, hanya menggunakan tar itu sendiri:
Diperlukan
--ignore-failed-read
jika tidak ada PDF baru untuk hari ini.sumber
Solusi terbaik tampaknya untuk membuat daftar file dan kemudian mengarsipkan file karena Anda dapat menggunakan sumber lain dan melakukan sesuatu yang lain dengan daftar tersebut.
Misalnya, ini memungkinkan penggunaan daftar untuk menghitung ukuran file yang diarsipkan:
sumber