Bir dosyayı aynı anda nasıl kopyalayabilir ve hedef dizinleri oluşturabilirim?


20

Ben istiyorum cp aaa/deep/sea/blob.psdiçinbbb/deep/sea/blob.psd

Nasıl olursa kopyasını yapacağım deepve seadizinleri altında bulunmayan bbbher ikisi de gereklidir dizinleri ve kopya dosya oluşturur kopya böylece?

Şu an
No such file or directoryderinleşiyorum ve deniz yok.

Adam yardım sayfaları ve diğer sorular aracılığıyla baktım ama hiçbir şey bana atlar.

Ben var en yakın rcpdizin için kullanmaktır :

rcp -r aaa/deep/sea/ bbb/deep/sea/

Bu tüm dizini ve içeriği kopyalar ve ben sadece bir dosya istiyorum. Ancak bunu yapmaya çalışmakcp: cannot create regular file bbb/deep/sea/blob.psd' such file or directory

Yanıtlar:


19

Böyle bir durum için böyle bir sonraki işlevi kullanmaya çalışın:

copy_wdir() { mkdir -p -- "$(dirname -- "$2")" && cp -- "$1" "$2" ; }

ve olarak kullan

copy_wdir aaa/deep/sea/blob.psd bbb/deep/sea/blob.psd

Bu arada, GNU'nun cpbir --parentsseçeneği var. Gerçekten istediğiniz şeye yakın, ama tam olarak değil.
Ayrıca aaaihtiyacınız olmayan dizin de oluşturacaktır . Ancak önce aşağıdaki gibi CD'ye aaakopyalayabilir ve kopyalayabilirsiniz:

cd aaa && cp --parents deep/sea/blob.psd ../bbb/

24

Automake gibi sistemler tarafından genellikle bu amaç için kullanılan coreutils'teninstall programı kullanmak kolaydır :

install -D /path/to/source /path/to/destination

Not installyaratan tüm yolun parçaları gibi mkdir -pyapar, bkz man install. Neden bunu yapmak istediğinizi neden eklemediğinizi merak ediyorum . Aramak mkdirve cpçok kolaydır.


2
Sanırım bu soruya çok iyi cevaplar var, ama bu benim oyumu en taşınabilir olduğu için alıyor. rsyncCevap sadece 1 dizin oluşturacaktır ve paxortak olmak görünmüyor.
Patrick

Mac -dyerine kullanın -D.
Matt M.

bu komutun 755( rwxr-xr-x) izinsiz hedef dosyaları oluşturduğunu unutmayın; -manahtarla başka bir şey belirtebilirsiniz , ancak sadece dosya izinlerini tutmanın bir yolunu bulamadım :(
törzsmókus

6

Standart (POSIX / Unix) komutlarıyla şunları elde edersiniz:

pax -rws ':^:dest/dir/:' file .

1
İlginç. Daha önce hiç pax duymamıştım. Ben onun konseptini seviyorum. Ne yazık ki POSIX'te olmasına rağmen, varsayılan olarak çok az dağıtım dağıtıyor gibi görünüyor :-(
Patrick

@Patrick - sonuna kadar atlarsanız info tar- taşınabilirlik endişeleri bölümünde bir yerde - GNU'nun tartamamen paxuyumlu olduğunu iddia edeceğinizi düşünüyorum . Yine de yaptım, ancak henüz bu iddiaları test etmek için etrafta dolaşmadım.
mikeserv

5

Bunu kullanarak yapmanın bir yolunun farkında değilim cp, ama kesinlikle mümkündür rsync:

$ rsync sourcefile dir/

burada dirbulunması gerekmeyen bir dizin. Diğer komutları kullanarak bunu başarmanın başka birçok yolu vardır.


3
rsync -RHeparrchy
Glenn Jackson

@glennjackman Gerçekten, 'uygun' kullanımı rsyncdaha fazla seçeneğe ihtiyaç duyuyor, ancak soru basitçe var olmayan bir hedef dizin, dolayısıyla kısa cevabım oluşturmakla
ilgiliydi

1
En azından GNU cpsahiptir --parentsseçeneği.
peterph

2
@peterph Gerçekten, ama daha sonra hedef dizinin adının kısıtlanması
mjturner

4
cd aaa
pax -rw deep/sea/blob.psd ../bbb

Eğer yoksa pax(standartlaştırmak için çok fazla uyumsuzluğa sahip olan cpio ve katranın standart olarak değiştirilmesi POSIX tarafından zorunlu kılındıysa), cpio -pveya tar -cf - … | tar -xf -yerine kullanın.

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.