Saya menyarankan Anda untuk menggunakan rsync daripada cp, jika Anda bisa memiliki opsi -m yang akan mengecualikan folder kosong, contoh:
rsync -am <origin> <destination>
Penjelasan perintah di explainshell.com
Saya menggunakan opsi -a karena melakukan banyak tindakan default yang bagus, tetapi jika mau, Anda juga dapat menggunakan opsi -r, yang hanya akan menyetel mode rekursif.
[TAMBAHKAN komentar]
Saya tidak tahu cara melakukan ini dengan cp, setidaknya halaman manual tidak menampilkan opsi apa pun yang akan melakukannya untuk Anda. Anda mungkin dapat melakukan solusi yang lebih rumit dengan menggunakan perintah find
untuk menemukan daftar file/direktori yang akan disalin, lalu meneruskannya ke cp, tetapi itu akan jauh lebih rumit daripada rsync. rsync bahkan cukup standar di banyak linux
cp
memang tidak memiliki opsi untuk mendapatkan file saja, tetapi seperti yang dikatakan berserck, Anda dapat menggunakan find
bersama dengan cp
. Faktanya, ini sangat mudah:
# Copy only files
find /path/to/file -type f -execdir cp "{}" /dest/path ";"
Atau:
# Copy everything except directories
find /path/to/file -not -type d -execdir cp "{}" /dest/path ";"
Penjelasan
find
adalah alat yang akan mencari file yang Anda inginkan. Pada opsi pertama, kita menetapkan -type f
untuk mengembalikan hanya file biasa. Pada opsi kedua, kita mengatur -not -type d
untuk mendapatkan semuanya kecuali direktori. find
mengeksekusi argumen yang diteruskan ke -execdir
mengganti {}
dengan satu entri hasil sekaligus dan menghentikan perintah saat ;
ditemukan (;
harus di-escape \;
atau ";"
, atau shell mungkin mengembangkannya).
-execdir
akan menjalankan perintah yang memiliki folder file sebagai "direktori kerja" dan lebih disukai daripada -exec
, periksa di bawah.
-type
dokumentasi opsi:
-ketik c
File bertipe c:
b:blokir (buffer) spesial
c:karakter (tanpa buffer) spesial
d:direktori
p:bernama pipa (FIFO)
f:file biasa
l:tautan simbolik; ini tidak pernah benar jika opsi -L atau opsi -ikuti berlaku, kecuali tautan simbolik rusak. Jika Anda ingin mencari tautan simbolis saat -L aktif, gunakan -xtype.
s:soket
D:pintu (Solaris)
-not
dokumentasi opsi:
! expr
Benar jika expr salah. Karakter ini juga biasanya membutuhkan perlindungan dari interpretasi oleh shell.
-bukan expr
Sama dengan ! expr, tetapi tidak sesuai dengan POSIX.
-execdir
dokumentasi opsi:
-exec perintah;
Jalankan perintah; benar jika 0 status dikembalikan. Semua argumen berikut untuk menemukan dianggap sebagai argumen untuk perintah sampai argumen yang terdiri dari ';' dihadapi. String '{}' diganti dengan nama file saat ini yang sedang diproses di mana pun itu muncul dalam argumen untuk perintah [...]. Kedua konstruksi ini mungkin perlu di-escape (dengan '\') atau dikutip untuk melindunginya dari perluasan oleh shell. Perintah yang ditentukan dijalankan sekali untuk setiap file yang cocok. Perintah dijalankan di direktori awal. Ada masalah keamanan yang tidak dapat dihindari seputar penggunaan tindakan -exec; Anda sebaiknya menggunakan opsi -execdir sebagai gantinya.
-execdir perintah;
Seperti -exec, tetapi perintah yang ditentukan dijalankan dari subdirektori yang berisi file yang cocok , yang biasanya bukan direktori tempat Anda mulai menemukan. Ini adalah metode yang jauh lebih aman untuk menjalankan perintah, karena menghindari kondisi balapan selama penyelesaian jalur ke file yang cocok. [...] Jika Anda menggunakan opsi ini, Anda harus memastikan bahwa variabel lingkungan $PATH Anda tidak mereferensikan '.'; jika tidak, penyerang dapat menjalankan perintah apa pun yang mereka suka dengan meninggalkan file dengan nama yang sesuai di direktori tempat Anda akan menjalankan -execdir. Hal yang sama berlaku untuk memiliki entri di $PATH yang kosong atau bukan nama direktori absolut.
https://linux.die.net/man/1/find