Salin hanya file biasa dari satu direktori ke direktori lain

12

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

pengguna1058398
sumber
1
Tidak tahu apa hubungannya dengan ekstensi.
ctrl-alt-delor
1
cp dir1/* dir2ataucp -t dir2 dir1/*
ctrl-alt-delor
@ Richard Ada kebiasaan yang cukup umum datang dari dunia DOS tidak menggunakan ekstensi untuk direktori, yang masih bertahan sampai batas tertentu, membuat beberapa orang berasumsi bahwa jika ada titik maka itu bukan direktori dan sebaliknya.
Gilles 'SANGAT berhenti menjadi jahat'
ok tapi masih belum relevan.
ctrl-alt-delor

Jawaban:

18
cp dir1/* dir2

cptidak akan menyalin direktori kecuali secara eksplisit disuruh melakukannya (dengan --recursivemisalnya, lihat man 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 : cpmengharapkan parameter terakhir menjadi satu nama file atau direktori. Seharusnya tidak ada wildcard *setelah nama direktori target. dir2\*akan diperluas oleh shell seperti dir1\*. Hal - hal tak terduga akan terjadi:

  • Jika dir2kosong dan tergantung pada shell dan pengaturan Anda:
    • Anda mungkin mendapatkan pesan kesalahan, yang merupakan skenario terbaik.
    • 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, pergi cp dir1/*. Yang, tergantung pada perluasan dir1/*, bahkan dapat menghancurkan data:
      • Jika dir1/*hanya cocok dengan satu file atau direktori, Anda akan mendapatkan kesalahan dari cp.
      • Jika dir1/*sama persis dengan dua file, satu akan ditimpa oleh yang lain ( Buruk ).
      • Jika dir/*cocok dengan beberapa file dan pertandingan terakhir adalah, Anda akan mendapatkan pesan kesalahan.
      • Jika pertandingan terakhir dir/*adalah direktori, semua pertandingan lainnya akan dipindahkan ke dalamnya.
  • Jika dir2tidak kosong, itu tergantung lagi:
    • Jika kecocokan terakhir dir2/*adalah direktori, dir1/*dan kecocokan lainnya dir2/*akan dipindahkan ke.
    • Jika kecocokan terakhir dir2/*adalah sebuah file, Anda mungkin akan mendapatkan pesan kesalahan, kecuali dir1/* hanya satu file yang cocok.
Adaephon
sumber
$ cp dir1/* dir2-> cp: dir1/isadir is a directory (not copied).keluar dengan status 1 untuk saya.
contrebis
1
Ya, itu keluar dengan status 1 untuk saya juga. Namun demikian, cpapakah menyalin file yang cocok dir1/*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 mana cpsebenarnya keluar dengan kode 2). Jadi perilaku ini bukan hal baru (SuSE 8.1 berasal dari tahun 2002) juga tidak terbatas pada Linux. cpkeluar dengan kode keluar non-nol karena tidak dapat melakukan semua yang diperintahkan untuk dilakukan. Itu tidak berarti tidak melakukan apa - apa .
Adaephon
3
Tentu, saya pikir perlu dicatat karena jika Anda chaining perintah bersama dengan &&ini dapat menyebabkan masalah. Saya mencoba sesuatu seperti ini meskipun saya tidak dapat mengingat konteksnya sekarang.
contrebis
Ini tidak menyalin file tersembunyi.
felwithe
@felwithe Apakah *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 ..pada bashdan dashtetapi tidak pada zsh. Dalam konteks jawaban ini Anda bisa lolos cp dir1/* dir1/.* dir2karena .dan ..adalah direktori dan tidak akan disalin. zshjuga dapat dibuat untuk menyertakan file tersembunyi *(D).
Adaephon
7

Shell yang mengembang wildcard, bukan perintah. Jadi cp dir1/* dir2/*pertama-tama perluas dua wildcard, lalu panggil cphasilnya. Ini sama sekali tidak seperti yang Anda harapkan: tergantung pada berapa banyak file yang sudah ada dir2, dir2/*dapat berkembang menjadi satu atau lebih argumen. Perintah cptidak 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 direktori dir1ke direktori dir2, argumen terakhir harus direktori dir2:

cp dir1/* dir2

Karena *cocok dengan semua file, cpupaya 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, atau cpakan memblokir), dll.

Untuk hanya menyalin file biasa , Anda perlu membatasi kecocokan. Di zsh, Anda dapat menggunakan kualifikasi glob . untuk itu:

cp dir1/*(.) dir2

Kerang lain tidak memiliki ini. Anda dapat menggunakan findperintah untuk memfilter pada jenis file. Dengan asumsi bahwa Anda menjalankan Linux atau Cygwin yang tidak tertanam:

find dir1 -maxdepth 1 -type f -exec cp -t dir2 {} +

Di Linux, FreeBSD dan OSX:

find dir1 -maxdepth 1 -type f | xargs -I {} cp {} dir2
Gilles 'SANGAT berhenti menjadi jahat'
sumber
Apakah ada alasan untuk menentukan -maxdepth 1. Juga, apakah ada cara untuk secara rekursif menyalin dan mempertahankan hierarki direktori asli di direktori tujuan?
Abdull
@Abdull Tanpa -maxdepth 1, findperintah 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.
Gilles 'SO- berhenti bersikap jahat'
0

Di bawah ini adalah perintah untuk menyalin file dari sumber ke direktori tujuan.

  1. Buka folder sumber lalu tulis perintah di bawah ini:

    $ cp fileName destination directory path

Contoh:

cp publichOT.sh  /data/home/useradmin
Tapan Dubey
sumber