Saya ingin menyalin konten direktori 1 ke direktori 2. Namun, saya hanya ingin menyalin file (dan bukan direktori) dari direktori saya 1. Bagaimana saya bisa melakukan itu?
cp dir1/* dir2/*
maka saya masih memiliki masalah direktori.
Juga, semua file saya tidak memiliki ekstensi apa pun, jadi . tidak akan melakukan trik
cp dir1/* dir2
ataucp -t dir2 dir1/*
Jawaban:
cp
tidak akan menyalin direktori kecuali secara eksplisit disuruh melakukannya (dengan--recursive
misalnya, lihatman cp
).Catatan 1:
cp
kemungkinan besar akan keluar dengan status bukan nol, tetapi file-file tersebut tetap akan disalin. Ini mungkin menjadi masalah ketika chaining perintah berdasarkan kode keluar:&&
,||
,if cp -r dir1/* dir2; then ...
, dll (Terima kasih kepada contrebis untuk komentar mereka tentang masalah yang )Catatan 2 :
cp
mengharapkan parameter terakhir menjadi satu nama file atau direktori. Seharusnya tidak ada wildcard*
setelah nama direktori target.dir2\*
akan diperluas oleh shell sepertidir1\*
. Hal - hal tak terduga akan terjadi:dir2
kosong dan tergantung pada shell dan pengaturan Anda:dir2/*
akan diambil secara harfiah (mencari nama file / direktori*
), yang mungkin akan menyebabkan kesalahan juga, kecuali*
benar-benar ada.dir2/*
itu hanya akan dihapus dari perintah sepenuhnya, pergicp dir1/*
. Yang, tergantung pada perluasandir1/*
, bahkan dapat menghancurkan data:dir1/*
hanya cocok dengan satu file atau direktori, Anda akan mendapatkan kesalahan daricp
.dir1/*
sama persis dengan dua file, satu akan ditimpa oleh yang lain ( Buruk ).dir/*
cocok dengan beberapa file dan pertandingan terakhir adalah, Anda akan mendapatkan pesan kesalahan.dir/*
adalah direktori, semua pertandingan lainnya akan dipindahkan ke dalamnya.dir2
tidak kosong, itu tergantung lagi:dir2/*
adalah direktori,dir1/*
dan kecocokan lainnyadir2/*
akan dipindahkan ke.dir2/*
adalah sebuah file, Anda mungkin akan mendapatkan pesan kesalahan, kecualidir1/*
hanya satu file yang cocok.sumber
$ cp dir1/* dir2
->cp: dir1/isadir is a directory (not copied).
keluar dengan status 1 untuk saya.cp
apakah menyalin file yang cocokdir1/*
pada setiap sistem yang saya periksa: Arch Linux, Ubuntu 14.04, OpenBSD 3.9 dan 5.5, SuSE Linux 8.1, FreeBSD 6.2, Solaris 8, 9 dan 10 (di manacp
sebenarnya keluar dengan kode 2). Jadi perilaku ini bukan hal baru (SuSE 8.1 berasal dari tahun 2002) juga tidak terbatas pada Linux.cp
keluar dengan kode keluar non-nol karena tidak dapat melakukan semua yang diperintahkan untuk dilakukan. Itu tidak berarti tidak melakukan apa - apa .&&
ini dapat menyebabkan masalah. Saya mencoba sesuatu seperti ini meskipun saya tidak dapat mengingat konteksnya sekarang.*
menyertakan file tersembunyi atau cara memasukkan file tersembunyi tergantung pada shell. Jika*
tidak menyertakan file tersembunyi, Anda dapat mencocokkannya dengan.*
. Perhatikan bahwa ini akan mencakup.
dan..
padabash
dandash
tetapi tidak padazsh
. Dalam konteks jawaban ini Anda bisa loloscp dir1/* dir1/.* dir2
karena.
dan..
adalah direktori dan tidak akan disalin.zsh
juga dapat dibuat untuk menyertakan file tersembunyi*(D)
.Shell yang mengembang wildcard, bukan perintah. Jadi
cp dir1/* dir2/*
pertama-tama perluas dua wildcard, lalu panggilcp
hasilnya. Ini sama sekali tidak seperti yang Anda harapkan: tergantung pada berapa banyak file yang sudah adadir2
,dir2/*
dapat berkembang menjadi satu atau lebih argumen. Perintahcp
tidak tahu argumen mana yang berasal dari memperluas pola pertama dan mana yang berasal dari memperluas pola kedua. Ia mengharapkan argumen terakhirnya menjadi nama direktori tujuan. Jadi, untuk menyalin semua file dari direktoridir1
ke direktoridir2
, argumen terakhir harus direktoridir2
:Karena
*
cocok dengan semua file,cp
upaya untuk menyalin semua file. Ini termasuk direktori: direktori juga file. Itu melompati direktori, tetapi melaporkan kesalahan. Ini menyalin konten file khusus seperti pipa bernama (sesuatu yang lebih baik menulis kepada mereka, ataucp
akan memblokir), dll.Untuk hanya menyalin file biasa , Anda perlu membatasi kecocokan. Di zsh, Anda dapat menggunakan kualifikasi glob
.
untuk itu:Kerang lain tidak memiliki ini. Anda dapat menggunakan
find
perintah untuk memfilter pada jenis file. Dengan asumsi bahwa Anda menjalankan Linux atau Cygwin yang tidak tertanam:Di Linux, FreeBSD dan OSX:
sumber
-maxdepth 1
. Juga, apakah ada cara untuk secara rekursif menyalin dan mempertahankan hierarki direktori asli di direktori tujuan?-maxdepth 1
,find
perintah akan muncul kembali menjadi subdirektori, yang tidak diinginkan di sini. Jika Anda ingin menyalin seluruh pohon direktori termasuk subdirektori, itu pertanyaan yang sama sekali berbeda, dan jawabannya adalah jauh lebih sederhana:cp -a dir1 dir2
.Di bawah ini adalah perintah untuk menyalin file dari sumber ke direktori tujuan.
Buka folder sumber lalu tulis perintah di bawah ini:
$ cp fileName destination directory path
Contoh:
sumber