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.