Saya mohon Anda, menjauhlah dari ekspansi shell biasa pada cpbaris 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 findsaja (ini ada dalam findutilspaket, 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:
-Hakan menyebabkan findtidak 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 1akan berhenti finddari turun secara rekursif ke direktori mana pun yang namanya dimulai dengan titik. Kita tidak perlu mengulanginya, cpakan melakukan itu untuk kita, kita hanya perlu nama-nama di tingkat ini.
-name '.*'memberitahu findkita bahwa kita ingin semua nama yang dimulai dengan titik. Ini tidak akan berfungsi dengan benar jika variabel lingkungan POSIXLY_CORRECTdiatur, 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 ltiga kondisi dengan atau di antara mereka. -type dcocok dengan direktori, -type fcocok dengan file biasa, dan -type lcocok dengan symlink. Anda dapat memilih apa yang Anda inginkan - misalnya, jika Anda tidak ingin membuat cadangan direktori pengaturan, hilangkan -type d(dan -otepat di belakangnya, jelas.)
-exec ..... \;memberitahu finduntuk 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, findbaris 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.
-rdan-R?