Cara menyalin file dari folder tanpa folder itu sendiri


39

Saya mencoba menyalin file dan subfolder dari folder A tanpa A itu sendiri. Misalnya, A folder berisi berikutnya:

| file1.txt   
| file2.txt    
| subfolder1   

Menjalankan perintah berikutnya memberi saya hasil yang salah:

sudo cp -r /home/username/A/ /usr/lib/B/

Hasilnya adalah

/usr/lib/B/A/...copied files...

dari pada..

/usr/lib/B/...copied files...

Bagaimana saya bisa mencapai yang diharapkan tanpa folder asal

Jawaban:


67

lanjutan cp

cp -r /home/username/A/. /usr/lib/B/

Ini sangat bagus karena berfungsi tidak masalah apakah direktori target sudah ada.

shell globbing

Jika tidak ada terlalu banyak objek di direktori maka Anda dapat menggunakan shell globbing:

mkdir -p /usr/lib/B/
shopt -s dotglob
cp -r /home/username/A/* /usr/lib/B/

rsync

rsync -a /home/username/A/ /usr/lib/B/

Di /ujung jalur sumber adalah penting; berfungsi tidak masalah apakah direktori target sudah ada.

menemukan

mkdir -p /usr/lib/B/
find /home/username/A/ -mindepth 1 -maxdepth 1 -exec cp -r -t /usr/lib/B/ {} +

atau jika Anda tidak memerlukan subdirektori kosong:

find /home/username/A/ -mindepth 1 -type f -exec cp --parents -t /usr/lib/B/ {} +

(tanpa mkdir)


Yang pertama berfungsi dengan baik! Adakah ide mengapa home / nama pengguna / A / * (dengan simbol bintang) tidak masuk akal? Varian dengan titik pada akhirnya membantu saya, terima kasih!
— pushandpop

@pushandpop A/*memang masuk akal tetapi ada situasi di mana itu tidak berhasil.
— Hauke ​​Laging

3
shoptadalah bashspesifik. Dengan zsh, gunakan *(D). dengan ksh93, FIGNORE='@(.|..)'. cp -tkhusus untuk GNU. Yang findtidak akan berfungsi sebagaimana mestinya karena akan menyalin keduanya A/dan kontennya (termasuk subdir) beberapa kali.
— Stéphane Chazelas

1
Anda juga ingin -maxdepth 1( -mindepthdan -maxdepthmenjadi ekstensi GNU sekarang juga didukung oleh beberapa orang lain. Portably find .../. ! -name . -prune -exec ....)
— Stéphane Chazelas

@ StéphaneChazelas Saya kira ada kesalahan ketik di suatu tempat. find .../.menyebabkan kesalahan di sini.
— Hauke ​​Laging

10

Jika pada sistem GNU, dari man cp:

   -T, --no-target-directory
          treat DEST as a normal file

Ini memungkinkan Anda menulis cp -rT /home/username/A/ /usr/lib/B/untuk melakukan hal yang benar.


Ini harus menjadi jawaban yang diterima, ini layak daripada shell globbing atau menggunakan sesuatu yang lain dari pada cp. Tetapi itu benar bahwa -Titu tidak akan bekerja dengan non-GNU cp.
— noraj

3

Katakan cpuntuk menyalin isi direktori dan bukan direktori itu sendiri:

sudo cp -r /home/username/A/* /usr/lib/B/

Terima kasih! Tetapi dikatakan: / usr / lib / B / bukan direktori
— pushandpop

Anda perlu agar shopt -s dotglobini berfungsi jika ada dotfile di /home/username/A/.
— talkloud

1
@pushandpop dengan baik, ya. Itulah target yang Anda miliki dalam pertanyaan Anda jadi saya berasumsi itu adalah direktori. Anda harus membuat target sebelum mencoba menyalin file ke dalamnya.
— terdon
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.