Anda dapat melakukan ini menggunakan -T
opsi di cp
.
Lihat Halaman manual untuk cp
.
-T, --no-target-directory
treat DEST as a normal file
Jadi sesuai contoh Anda, berikut ini adalah struktur file.
$ tree test
test
|-- bar
| |-- a
| `-- b
`-- foo
|-- a
`-- b
2 directories, 4 files
Anda dapat melihat perbedaan yang jelas saat Anda menggunakan -v
Verbose.
Saat Anda menggunakan -R
opsi saja .
$ cp -Rv foo/ bar/
`foo/' -> `bar/foo'
`foo/b' -> `bar/foo/b'
`foo/a' -> `bar/foo/a'
$ tree
|-- bar
| |-- a
| |-- b
| `-- foo
| |-- a
| `-- b
`-- foo
|-- a
`-- b
3 directories, 6 files
Ketika Anda menggunakan opsi -T
itu menimpa konten, memperlakukan tujuan seperti file biasa dan bukan direktori .
$ cp -TRv foo/ bar/
`foo/b' -> `bar/b'
`foo/a' -> `bar/a'
$ tree
|-- bar
| |-- a
| `-- b
`-- foo
|-- a
`-- b
2 directories, 4 files
Ini seharusnya menyelesaikan masalah Anda.
bar/
) tetapi tidak di sumber (foo/
) akan ditinggalkan di tempatnya, jadi ini bukan apa yang dianggap kebanyakan orang sebagai penimpaan direktori secara lengkap. yaitu. jikabar/baz
sudah ada, itu akan tetap ada setelah itu ...rm -rf bar/* && cp -TRv foo/ bar/
Lakukan dalam dua langkah.
sumber
bar
konten identik denganfoo
, bukan kombinasi item darifoo
plus item lain yang mungkin sudah ada dibar
. Jawaban yang sangat disukai dari @Saurabh Meshram di bawah ini memiliki masalah ini.rm -rf bar/; cp -r foo/ !$
foo
danbar
adalah direktori besar ... mungkin ada file dalambar
yang tidak difoo
bahwa Anda tidak ingin menghapus. Ini seharusnya tidak dianggap sebagai jawaban yang realistis imhoJika Anda ingin memastikan
bar/
hasilnya samafoo/
, gunakanrsync
saja:Jika hanya beberapa hal yang berubah, ini akan berjalan lebih cepat daripada menghapus dan menyalin ulang seluruh direktori.
-a
adalah 'mode arsip', yang menyalin file sesuai aslinyafoo/
kebar/
--delete
menghapus file tambahan tidakfoo/
daribar/
juga, memastikanbar/
ujung up identik-vh
untuk verbose dan dapat dibaca manusiafoo
diperlukan, jika tidakrsync
maka akan disalinfoo/
kebar/foo/
daripada menimpabar/
dirinya sendiri.foo/
ke isibar/
, kami menggunakan garis miring pada kedua ini membingungkan karena tidak akan bekerja seperti yang diharapkan dengan sebuah garis miring pada. tidak , meskipun; rsync diam-diam selalu menafsirkan jalur tujuan seolah-olah itu memiliki garis miring, meskipun menghormati tidak adanya garis miring pada sumber jalan. Jadi kita perlu garis miring di jalan sumber untuk membuatnya sesuai dengan slash auto-ditambahkan pada jalur tujuan, jika kita ingin menyalin isi darifoo/
dalambar/
, bukan direktorifoo/
sendiri mendaratbar/
sebagaibar/foo
.)rsync
sangat kuat dan berguna, jika Anda penasaran melihat-lihat apa lagi yang bisa dilakukan (seperti menyalin ssh).sumber
cp -T
opsi karena juga berfungsi pada macosx 👍Gunakan
cp
perintah ini :sumber
cp
perintah harus menghapus file dari sumber?Perintah berikut memastikan dotfiles (file tersembunyi) disertakan dalam salinan:
sumber
.
artinya semua file dalam direktori. Jadi, tentu saja file yang tersembunyi akan disertakan.Sangat mirip dengan @Jonathan Wheeler:
Jika Anda tidak ingin mengingat, tetapi tidak menulis ulang
bar
:!$
menampilkan argumen terakhir dari perintah Anda sebelumnya.sumber
ini seharusnya menyelesaikan masalah Anda.
sumber
Operasi yang Anda tetapkan adalah "gabungan" dan Anda tidak dapat melakukannya dengan
cp
. Namun, jika Anda tidak mencari penggabungan dan ok untuk kehilangan folder,bar
Anda cukuprm -rf bar
menghapus folder dan kemudianmv foo bar
mengganti namanya. Ini tidak akan memakan waktu karena kedua operasi dilakukan oleh penunjuk file, bukan konten file.sumber
Coba gunakan perintah yang terdiri dari dua langkah ini:
sumber