Saya mencoba menyalin semua file dan folder dari satu direktori ke direktori lain, tetapi mengecualikan file tertentu. Secara khusus, saya ingin mengecualikan file dan folder subversi. Namun, saya ingin solusi umum namun ringkas.
Saya membayangkan saya akan menemukan kebutuhan untuk mengecualikan beberapa jenis file dalam waktu dekat. Misalnya, saya mungkin ingin mengecualikan .svn, * .bak, dan * .prj.
Inilah yang saya buat untuk itu, tetapi tidak berhasil untuk saya. Bagian pertama, temukan karya, tapi saya melakukan kesalahan dengan xargs dan cp . Saya mencoba cp dengan dan tanpa -R
. Juga, saya menggunakan OS X dan tampaknya memiliki versi xargs yang kurang fitur daripada sistem linux.
find ./sourcedirectory -not \( -name .svn -a -prune \)
| xargs -IFILES cp -R FILES ./destinationdirectory
find
perintah benar menggunakan-prune
untuk mengecualikan svn item, Anda kemudian lulus-R
bendera untukcp
yang memberitahu bahwa perintah untuk menjadi rekursif. Ketika itu terjadi, Anda kehilangan rincian apa pun yang Anda miliki dalamfind
perintah. Saya akan mengotak-atik ini sebentar, tapi saya pikir jawabannya adalah tidak menggunakan-R
dalamcp
perintah.-R
benderanya, saya cukup yakin. Hapus itu dan Anda harus baik-baik (meskipun Anda mungkin ingin menambahkan-mindepth 1
mengabaikan direktori toplevel folder yang Anda tidak ingin menyalin, saya berasumsi)Jawaban:
(Diedit setelah membaca kembali pertanyaan. Penanya mengatakan rsync tidak diinstal)
Kemungkinan masalah dengan solusi find / xargs Anda adalah spasi pada nama file. Untuk menyiasatinya, beri tahu find dan xargs untuk menggunakan karakter nol (ASCII 0) untuk memisahkan file yang ditemukan:
Jika Anda menemukan bahwa rsync tersedia, saya masih berpikir bahwa rsync adalah solusi yang jauh lebih baik:
Gunakan rsync dengan opsi -C. Dari halaman manual rsync :
Ini akan memberitahu rsync untuk mengabaikan pola-pola ini:
Sebagai contoh:
(catatan: Jika Anda belum terbiasa dengan rsync, pastikan untuk membaca di halaman manual itu tentang bagaimana rsync berurusan dengan garis miring di jalur sumber. Berperilaku berbeda jika Anda memasukkan garis miring daripada jika Anda tidak. Cari 'trailing slash')
sumber
-R
bendera dixargs
bagian perintah.Bukan solusi umum tetapi ... Anda dapat menggunakan perintah ekspor svn untuk membuat salinan ruang kerja tanpa folder metadata .svn.
sumber
jika mau, Anda bahkan dapat menempatkan 'pv' atau yang serupa di antara proses 2 tar.
sumber
Cara kotor tapi cepat dan ringkas:
Ini menyalin satu direktori ke direktori lain (dengan demikian opsi rekursif
-r
) dan kemudian secara rekursif menghapus apa pun yang dinamai.svn
(mengabaikan kasing).sumber
Saya akan melakukannya dengan cara yang berbeda, menggunakan tar dan mekanisme pengecualiannya.
Dari di direktori tujuan:
Ini akan cd untuk sumber, tar konten, tidak termasuk apa yang tercantum dalam excludefile, dan kemudian untar ke direktori saat ini.
sumber
Jawaban yang diedit : Masalahnya adalah
-R
membuat salinan Anda rekursif dan akhirnya Anda menyalin file yang tersembunyi. Inilah yang akan saya gunakan:The
-mindepth 1
bendera mengatakanfind
untuk mengabaikan direktori tingkat teratas. Karena Anda ingin menyalin semua konten direktori itu ke direktori tingkat atas baru, saya berasumsi Anda tidak menginginkannya.Seperti yang dikatakan Chris Nava dalam jawabannya , sudah ada cara bawaan untuk melakukan ini jika kita berbicara tentang folder SVN, tetapi karena Anda meminta solusi yang lebih umum, ini mungkin sedikit membantu.
sumber
xargs
tidak rusak, tetapi pada sistem mirip Unix, defaultnya adalah tidak menggunakan nama file (atau nama direktori) dengan spasi di dalamnya. Jika Anda memiliki spasi atau karakter "lucu" dalam nama file Anda (atau nama direktori), maka Anda harus melakukan pekerjaan ekstra untuk menghadapinya. (Dalam GNUfind
, ada seluruh bagian diman
halaman yang disebut "FILENAMEN TIDAK BIASA" karena masalah ini.)-0
Bendera masukxargs
dan-print0
untukfind
bantuan untuk menangani masalah ini. Namun, saya berjanji kepada Anda bahwa Anda tidak ingin menggunakannya-R
dalam perintah penyalinan Anda. Ini akan membatalkan apa pun yang Anda lakukan untuk menghindari direktori SVN.Saya kira itu tergantung seberapa besar pohon Anda, tetapi mengapa tidak hanya menyalin semuanya dulu, lalu pangkas folder .svn setelah:
?
sumber
find
perintah yang tepat , tetapi Anda hanya melakukannya sekali. Anda dapat menggunakan perintah ratusan kali, setelah Anda melakukannya dengan benar.find
lebih baik, sehingga saya tidak perlu melakukan ini. Tapi Anda benar: tidak ada yang salah dengan solusi ini.Jangan lupa grep -v
sumber
Anda juga bisa melakukan yang sebaliknya. Salin semuanya kemudian hapus folder .svn menggunakan perintah di bawah ini:
sumber