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:
-H
akan menyebabkanfind
tidak 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 1
akan menghentikanfind
dari secara rekursif turun ke direktori mana pun yang namanya dimulai dengan titik. Kita tidak membutuhkannya untuk berulang,cp
akan melakukannya untuk kita, kita hanya perlu nama di level ini.-name '.*'
memberi tahufind
bahwa kita menginginkan semua nama yang dimulai dengan titik. Ini tidak akan bekerja dengan benar jika variabel lingkunganPOSIXLY_CORRECT
diatur, 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 l
adalah tiga kondisi dengan atau diantara 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 mencadangkan direktori pengaturan, abaikan-type d
(dan-o
tepat di belakangnya, tentunya.)-exec ..... \;
memberi tahufind
untuk 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.