GNU/Linux >> Belajar Linux >  >> Linux

Menyalin file tersembunyi secara rekursif - Linux

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 menyebabkan find 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 menghentikan find 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 tahu find bahwa kita menginginkan semua nama yang dimulai dengan titik. Ini tidak akan bekerja dengan benar jika variabel lingkungan POSIXLY_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 tahu find 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 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 - 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.


Linux
  1. Menghitung file secara rekursif dalam direktori Linux

  2. Menyalin file berdasarkan tanggal modifikasi di Linux

  3. Ganti nama file secara rekursif (ubah ekstensi) di Linux

  1. Cara Menemukan File Di Linux Di Semua Direktori Secara Rekursif

  2. Sembunyikan file tersembunyi Linux di Windows

  3. Bagaimana cara chmod dan chown file tersembunyi di Linux?

  1. gunakan SED secara rekursif di linux?

  2. Cara cepat menghitung file secara rekursif di linux

  3. Menyalin pengguna dan kata sandi Linux ke server baru