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

pushandpop
sumber

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)

Hauke ​​Laging
sumber
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.

michas
sumber
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/
terdon
sumber
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