Saya mohon Anda, menjauhlah dari ekspansi shell biasa pada cp
baris perintah - ekspansi shell memiliki segala macam kasus sudut "menarik" ahem (rekursi yang tidak diinginkan yang disebabkan oleh. Dan .., spasi, hal-hal yang tidak dapat dicetak, hardlink, tautan simbolik, dan seterusnya.) Gunakan find
saja (ini ada dalam findutils
paket, jika Anda belum menginstalnya - yang akan aneh, semua distribusi menginstalnya secara default):
find -H /path/to/toplevel/dir/ -maxdepth 1 -name '.*' -a \( -type d -o -type f -o -type l \) -exec cp -a '{}' /path/to/destination/dir/ \;
Penjelasan langkah demi langkah:
-H
akan menyebabkan find
tidak mengikuti symlinks (kecuali jika nama direktori toplevel sebenarnya yang Anda berikan adalah symlink; itu akan mengikuti.)
/path/to/toplevel/dir/
Jelas, seharusnya diganti oleh Anda dengan path melakukan direktori yang menampung file pengaturan dan direktori yang ingin Anda buat cadangannya.
-maxdepth 1
akan berhenti find
dari turun secara rekursif ke direktori mana pun yang namanya dimulai dengan titik. Kita tidak perlu mengulanginya, cp
akan melakukan itu untuk kita, kita hanya perlu nama-nama di tingkat ini.
-name '.*'
memberitahu find
kita bahwa kita ingin semua nama yang dimulai dengan titik. Ini tidak akan berfungsi dengan benar jika variabel lingkungan POSIXLY_CORRECT
diatur, tetapi jarang (jika pernah). Ini adalah kondisi pertandingan pertama yang kami tentukan sejauh ini.
a \( ....... \)
adalah dan diikuti oleh kondisi yang lebih kompleks di dalam tanda kurung (saya telah menggunakan ..... untuk menggantinya, dijelaskan di bawah ini.) Kita perlu melarikan diri dari tanda kurung karena kalau tidak mereka akan (salah) ditafsirkan oleh shell, maka garis miring terbalik di depan mereka,
-type d -o -type f -o -type l
tiga kondisi dengan atau di antara mereka. -type d
cocok dengan direktori, -type f
cocok dengan file biasa, dan -type l
cocok dengan symlink. Anda dapat memilih apa yang Anda inginkan - misalnya, jika Anda tidak ingin membuat cadangan direktori pengaturan, hilangkan -type d
(dan -o
tepat di belakangnya, jelas.)
-exec ..... \;
memberitahu find
untuk mengeksekusi perintah setiap kali kecocokan ditemukan. Akhir dari perintah ditandai dengan tanda titik koma, yang lagi-lagi kita perlu melarikan diri dengan backslash untuk menghindari interpretasi shell. Di dalam baris perintah itu, Anda harus menggunakan di {}
mana Anda ingin nama kecocokan yang saat ini ditemui berakhir. Karena kerang mungkin juga salah menafsirkan kurung kurawal, Anda harus meletakkannya di apostrof, seperti pada '{}'
. Perintah yang ingin kita jalankan dalam kasus ini adalah cp -a '{}' /path/to/destination/dir/
(-a berarti arsip, yang berulang dalam subdirektori, menyalin symlink sebagai tautan, dan mempertahankan izin dan atribut yang diperluas, dan /path/to/destination/dir/
jelas merupakan nama direktori tujuan - ganti itu.)
Jadi, dalam bahasa Inggris yang sederhana, find
baris perintah ini mengatakan ini:
Mulai dari / path / ke / tingkat atas / dir /. Jangan turun ke subdirektori mana pun. Temukan semua direktori, file, dan symlink yang namanya dimulai dengan titik. Untuk setiap yang Anda temukan ditemukan, salin ke / path / ke / tujuan / dir / melestarikan alam, izin, dan atribut yang diperluas.
-r
dan-R
?