Solusi 1:
Hampir setiap saat hal ini dapat diselesaikan hanya dengan:
cp -R .[a-zA-Z0-9]* directory
Sangat tidak biasa memiliki file tersembunyi yang tidak dimulai dengan salah satu karakter tersebut.
Pencocokan pola lainnya tersedia (.??* , .[^.]* ) - lihat komentar
Solusi 2:
Favorit saya untuk memindahkan direktori secara umum adalah:
tar cvf - . | (cd /dest/dir; tar xvf -)
yang menaikkan direktori saat ini ke stdout lalu menyalurkannya ke subkulit yang cd pertama ke direktori tujuan sebelum melepaskan stdin. Sederhana, langsung, dapat diperluas - pertimbangkan apa yang terjadi jika Anda mengganti () dengan ssh ke komputer lain. Atau untuk menjawab pertanyaan Anda, Anda dapat melakukan:
tar cvf - .* --exclude=\. --exclude=\.\. | (cd /dest/dir; tar xvf -)
Solusi 3:
Anda dapat menggunakan rsync .
rsync -a ./ /some/other/directory/
yang akan menyalin konten direktori saat ini (termasuk file dot, tetapi tidak termasuk .. )
Solusi 4:
Saya mohon, menjauh dari ekspansi shell biasa di cp baris perintah - ekspansi shell memiliki semua jenis ahem kasus sudut "menarik" (rekursi yang tidak diinginkan disebabkan oleh . dan .., spasi, hal-hal yang tidak dapat dicetak, tautan keras, tautan simbolik, dan sebagainya.) Gunakan find sebagai gantinya (muncul di 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:
-Hakan menyebabkanfindtidak mengikuti symlink (kecuali jika nama direktori tingkat atas sebenarnya yang Anda berikan adalah symlink; yang akan diikuti.)/path/to/toplevel/dir/jelas, seharusnya diganti oleh Anda dengan jalur direktori yang menyimpan file pengaturan dan direktori yang ingin Anda buat cadangannya.-maxdepth 1akan menghentikanfinddari secara rekursif turun ke direktori mana pun yang namanya dimulai dengan titik. Kita tidak membutuhkannya untuk berulang,cpakan melakukannya untuk kita, kita hanya perlu nama di level ini.-name '.*'memberi tahufindbahwa kita menginginkan semua nama yang dimulai dengan titik. Ini tidak akan bekerja dengan benar jika variabel lingkunganPOSIXLY_CORRECTdiatur, tetapi jarang (jika pernah). Ini adalah kondisi kecocokan pertama yang telah kami tentukan sejauh ini.a \( ....... \)adalah dan diikuti oleh kondisi yang lebih kompleks dalam tanda kurung (saya telah menggunakan ..... untuk menggantinya, dijelaskan di bawah.) Kita perlu keluar dari tanda kurung karena jika tidak maka akan (salah) diinterpretasikan oleh shell, maka garis miring terbalik di depan mereka,-type d -o -type f -o -type ladalah tiga kondisi dengan atau diantara 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 mencadangkan direktori pengaturan, abaikan-type d(dan-otepat di belakangnya, tentunya.)-exec ..... \;memberi tahufinduntuk mengeksekusi perintah setiap kali pertandingan ditemui. Akhir dari perintah ditandai dengan titik koma, yang sekali lagi perlu kita hindari dengan garis miring terbalik untuk menghindari interpretasi shell. Di dalam baris perintah itu, Anda perlu menggunakan{}di mana Anda ingin nama pertandingan yang ditemui saat ini berakhir. Karena shell mungkin juga salah mengartikan kurung kurawal, Anda harus menempatkannya di apostrof, seperti pada'{}'. Perintah yang ingin kita jalankan dalam hal ini adalahcp -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 - gantilah.)
Jadi, dalam bahasa Inggris biasa, find ini baris perintah mengatakan ini:
Mulai dari /path/to/toplevel/dir/. Jangan turun ke subdirektori mana pun. Temukan semua direktori, file, dan symlink yang namanya dimulai dengan titik. Untuk setiap yang Anda temukan, salin ke /path/to/destination/dir/ melestarikan sifat, izin, dan atribut tambahan.
Solusi 5:
Saya selalu menggunakan .??* untuk menemukan file tersembunyi tanpa mendapatkan "." dan "..". Namun, itu mungkin melewatkan ".a" atau sesuatu, tetapi saya tidak pernah memiliki salah satunya.