Klasörün kendisi olmadan klasördeki dosyalar nasıl kopyalanır


39

A klasöründeki dosyaları ve alt klasörleri A'nın kendisi olmadan kopyalamaya çalışıyorum . Örneğin, bir klasör daha sonra içerir:

| file1.txt   
| file2.txt    
| subfolder1   

Bir sonraki komutu çalıştırmak bana yanlış sonuç veriyor:

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

Sonuç

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

onun yerine..

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

Kaynak klasör olmadan beklenen kişiye nasıl ulaşabilirim?

Yanıtlar:


67

gelişmiş cp

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

Bu özellikle harikadır çünkü hedef dizinin mevcut olup olmadığının önemi yoktur.

kabuk taşlama

Dizinde çok fazla nesne yoksa, kabuk globbingini kullanabilirsiniz:

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/

/Kaynak yolunun sonundaki önemlidir; Hedef dizinin zaten var olup olmadığına bakmaksızın çalışır.

bulmak

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

veya boş alt dizinlere ihtiyacınız yoksa:

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

(olmadan mkdir)


İlki iyi çalışıyor! Herhangi bir fikir neden home / username / A / * (yıldız-sembollü) yapmaz duygusu? Sonunda nokta olan varyant bana yardımcı oldu, teşekkürler!
pushandpop

@pushandpop A/*anlamlıdır ancak çalışmadığı durumlar vardır.
Hauke,

3
shoptolduğu bashbelirli. İle zshkullanın *(D). ile ksh93, FIGNORE='@(.|..)'. cp -tGNU’ya özgüdür. findHer iki kopyalar gibi bir düzgün çalışmaz A/ve birkaç kez (subdirs dahil) içeriğini.
Stéphane Chazelas

1
Siz de istersiniz -maxdepth 1( -mindepthve -maxdepthGNU eklentisi olmak artık birkaç kişi tarafından da desteklenmektedir. Taşınabilir find .../. ! -name . -prune -exec ....)
Stéphane Chazelas

@ StéphaneChazelas Sanırım bir yerlerde bir yazım hatası var. find .../.burada bir hataya neden olur.
Hauke,

10

Bir GNU sisteminde ise, aşağıdakilerden man cp:

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

Bu cp -rT /home/username/A/ /usr/lib/B/tam olarak doğru olanı yapmak için yazmanıza olanak sağlar .


Bu kabul edilen cevap olmalı, bu kabuk kabarma ya da başka bir şey kullanmaktan daha uygun cp. Ancak bu -TGNU dışı bir insanla çalışmaz cp.
Noraj

3

Söyle cpdizinin içeriğini değil, dizinin kendisini kopyalamak için:

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

Teşekkürler! Ama yazıyor: / usr / lib / B / bir dizin değil
pushandpop

shopt -s dotglobHerhangi bir dotfiles varsa bunun çalışması için ihtiyacınız olacak /home/username/A/.
talkloud

1
pushandpop iyi, evet. Sorunuzla ilgili hedefiniz buydu, bu yüzden bir dizin olduğunu varsaydım. Dosyaları kopyalamaya çalışmadan önce hedefi oluşturmanız gerekir.
terdon
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.