İfade etmenin bir yolu var mı?


11

Anlamanın bir yolu var mı cpiçin --linkben arası cihaz sabit bağları çalışılıyor nerede (yani sert bağlantıları oluşturmak), ancak durumunda geri düşmek? Cihazlar arası bağlantılar mümkün değildir ve cpbaşarısız olmasına neden olur.

Sormamın nedeni, bunu bir kullanmak istiyorum GNUmakefileve bazı kıvrık ve uzun olana (veya bu konu için bir fonksiyona) okunabilir bir komut satırı tercih etmem .

Soru GNU coreutils (7.4 ve 8.13) içindir.

Not: şu anda geçici çözüm aşağıdaki gibidir (GNU tarifi sözdizimi yap):

cp -fl $^ $@ || cp -f $^ $@

Bu, elbette ikinci cpçağrıda başarılı olmasına rağmen, cihazlar arası bağlantılar durumunda sahte hata mesajları verecektir . Ayrıca, bu genişletilir (sonuçta kaynak formu okunabilir görünüyor) artık çok okunamayacak.

Yanıtlar:


8

cpbu seçeneğe sahip değil. Bir sarıcı komut dosyası yazabilirsiniz, ancak oldukça basit.

ln -f $^ $@ 2>/dev/null || cp -f $^ $@

GNU Coreutils 7.5 --reflinkseçeneği tanıttı . Aktarırsanız --reflink=autove temel dosya sistemi yazma üzerine kopyalamayı (örn. Btrfs veya ZFS) destekliyorsa ve kopya aynı cihazda olursa, cpyeni bir inode oluşturur, ancak içeriği kopyalamaz; aksi takdirde cpnormal bir kopya gerçekleştirir. Bu hala zor bir bağlantı değil (hedef her zaman farklı bir inode olacaktır), ancak muhtemelen kullanım durumunuz için daha da iyidir. Bununla birlikte, yazma üzerine kopyalamayı desteklemeyen ext4'te (günümüzde çoğu insan gibi) iseniz, bu size yardımcı olmaz.


1
Teşekkürler, $$benim durumumda çift elbette çünkü bu bir makro içinde. Ve tabii ki benim kullandığım şeyin bir varyasyonu. Ama en azından bu şekilde bir seçenek olarak var olmadığını biliyorum ve kendiminkini sağlamam gerek
0xC0000022L

1
Bu arada, birkaç yıl içinde, btrfs ext4'ü eklediğinde, notu kullanmak lnve kullanmak isteyebilirsiniz cp --reflink=auto(güncellenmiş cevabıma bakın).
Gilles 'SO- kötü olmayı bırak'

teşekkürler, minnettarım. Bir noktada bu seçeneği görmüş olmama rağmen farkında değildim.
0xC0000022L
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.