Salin file dari satu direktori ke direktori yang ada

248

Dalam bash saya perlu melakukan ini:

  1. ambil semua file dalam direktori

  2. salin ke direktori yang ada

Bagaimana saya melakukan ini? Saya mencoba cp -r t1 t2(baik t1 dan t2 adalah direktori yang ada, t1 memiliki file di dalamnya) tetapi ia membuat direktori yang disebut t1 di dalam t2, saya tidak ingin itu, saya perlu file di t1 untuk masuk langsung ke dalam t2. Bagaimana saya melakukan ini?

David Chang
sumber
11
Mengapa ini ditutup? Adalah sewenang-wenang jika perintah bash adalah perintah internal atau eksternal (mis. Printf ada sebagai keduanya pada sebagian besar sistem), sehingga cppertanyaan dapat dilihat sebagai bashpertanyaan, yang merupakan bahasa pemrograman. Saya belum pernah melihat pertanyaan Python berbicara tentang menyalin file ditutup.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
Saya tiba untuk mencari pengingat tentang sintaksis perintah copy Bash shell, dan saya senang melaporkan bahwa perintah ini tampaknya juga bekerja melawan sistem file NTFS yang mendasarinya pada instalasi Windows saya.
David A. Gray

Jawaban:

396

Yang Anda inginkan adalah:

cp -R t1/. t2/

Titik di bagian akhir memberitahukannya untuk menyalin isi direktori saat ini, bukan direktori itu sendiri. Metode ini juga termasuk file dan folder tersembunyi.

Nick
sumber
2
Saya sangat suka sintaks ini, tetapi karena beberapa alasan tidak berhasil mv. Adakah yang tahu mengapa?
Martin von Wittich
2
Luar biasa. Di mana ini didokumentasikan? Apakah POSIX atau ekstensi?
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
9
@CiroSantilli 六四 事件 法轮功 包 卓 轩 Jika Anda menyalin direktori, cp akan membuat direktori dan menyalin semua file ke dalamnya. Jika Anda menggunakan folder pura-pura bernama ".", Yang sama dengan direktori yang menahannya, salinannya berlaku seperti ini. Katakanlah t1 berisi file yang disebut "file". cp akan melakukan operasi yang setara dengan "cp t1 /./ file t2 /./". Ini menyalin folder ".", Tetapi menyalin file ke t2's "." folder menghapus "./" karena "t2 /./" sama dengan "t2 /". Secara teknis, ini berarti perilaku POSIX bawaannya ... tapi mungkin tidak seperti yang Anda harapkan!
menyerang
35

Jika Anda ingin menyalin sesuatu dari satu direktori ke direktori saat ini , lakukan ini:

cp dir1/* .

Ini mengasumsikan Anda tidak mencoba menyalin file tersembunyi.

Karl Giesing
sumber
20
Merindukan file yang tersembunyi.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
1
Juga gagal untuk sejumlah besar file (karena '*' tidak dapat memperluas ke banyak file tanpa batas ..) y
moritzschaefer
32
cp dir1/* dir2

Atau jika Anda memiliki direktori di dalam dir1 yang ingin Anda salin juga

cp -r dir1/* dir2
Bertrand Marron
sumber
3
Bergantung pada bagaimana konfigurasi shell Anda, Anda mungkin perlu menggunakan "dir1 / * dir1 /.*" daripada "dir1 / *" jika Anda ingin juga menangkap file tersembunyi.
ssokolow
2
Menyalin dir1/.*bukanlah ide yang baik, karena menyalin dir1 / .. (yaitu induk dari direktori yang Anda coba salin). Itu juga salinan dir1 /. yang baik-baik saja, kecuali bahwa itu sudah (sebagian besar) disalin, jadi Anda melakukan pekerjaan itu dua kali.
Gordon Davisson
1
Anda dapat mengatasi masalah dir1/.*/ file tersembunyi dengan memasukkan direktori yang ingin Anda salin, dan kemudian merujuknya sebagai .. Jadi, jika Anda ingin menyalin semua file termasuk file tersembunyi dari direktori ke direktori yang ada, Anda dapat: cd [source dir], cp . [path to destination dir, with no trailing slash].
RobW
8

Mengasumsikan t1 adalah folder dengan file di dalamnya, dan t2 adalah direktori kosong. Yang Anda inginkan adalah sesuatu seperti ini:

sudo cp -R t1/* t2/

Ingat, untuk contoh pertama, t1 dan t2 harus berupa path lengkap, atau path relatif (berdasarkan di mana Anda berada). Jika mau, Anda dapat menavigasi ke folder kosong (t2) dan melakukan ini:

sudo cp -R t1/* ./

Atau Anda dapat menavigasi ke folder dengan file (t1) dan melakukan ini:

sudo cp -R ./* t2/

Catatan: Tanda * (atau wildcard) adalah singkatan dari semua file dan folder. Bendera -R berarti secara rekursif (semua yang ada di dalam segalanya).

Konkret
sumber
2
cp -R t1/ t2

Garis miring pada direktori sumber sedikit mengubah semantik, sehingga menyalin isi tetapi bukan direktori itu sendiri. Ini juga menghindari masalah dengan globbing dan file tak terlihat yang dimiliki Bertrand (menyalin t1/*kehilangan file yang tak terlihat, menyalin `t1 / * t1 /.* 'salinan t1 /. Dan t1 / .., yang tidak Anda inginkan).

Gordon Davisson
sumber
Solusi Anda tidak berfungsi, setidaknya tidak pada instalasi saya (ubuntu 12.10) $ mkdir t1 $ mkdir t2 $ touch t1/one $ touch t1/two $ touch t1/.three $ cp -R t1/ t2 $ ls t2/ t1 (maaf tidak ada format kode dalam komentar, versi yang dapat dibaca di pastebin.com/yszSxV6G )
zpon
2

Tergantung pada beberapa detail, Anda mungkin perlu melakukan sesuatu seperti ini:

r=$(pwd)
case "$TARG" in
    /*) p=$r;;
    *) p="";;
    esac
cd "$SRC" && cp -r . "$p/$TARG"
cd "$r"

... ini pada dasarnya berubah ke direktori SRC dan menyalinnya ke target, lalu kembali ke tempat Anda memulainya.

Perhatian ekstra adalah untuk menangani target relatif atau absolut.

(Ini tidak bergantung pada semantik halus dari cpperintah itu sendiri ... tentang bagaimana ia menangani spesifikasi sumber dengan atau tanpa trailing / ... karena saya tidak yakin itu stabil, portabel, dan dapat diandalkan selain hanya GNU cpdan saya tidak tahu apakah mereka akan terus seperti itu di masa depan).

Jim Dennis
sumber
1

Untuk di dalam beberapa direktori, ini akan digunakan penuh karena menyalin semua konten dari "folder1" ke direktori baru "folder2" di dalam beberapa direktori.

$ (pwd) akan mendapatkan path untuk direktori saat ini.

Perhatikan titik (.) Setelah folder1 untuk mendapatkan semua konten di dalam folder1

cp -r $(pwd)/folder1/. $(pwd)/folder2
Bidyashish Kumar
sumber