POSIXly seçeneği pax
ile okuma + yazma modunda kullanırsınız -l
:
pax -rwlpe -s /A/B/ dirA .
( -pe
GNU gibi, kopyalanan bu durumda tüm dosyaları olası özellik (sadece dizinleri) korur cp
'ın -a
yapar).
Şimdi, standart olsa da , bu komut mutlaka çok taşınabilir değildir .
İlk olarak, çoğu GNU / Linux tabanlı sistem pax
varsayılan olarak içermez (isteğe bağlı olmayan bir POSIX yardımcı programı olmasına rağmen).
Daha sonra, birkaç uygulamayla birlikte bazı hatalar ve uygunsuzluklar bu kodla ilgili bir takım sorunlara neden olmaktadır.
- bir hata nedeniyle, Solaris 10
pax
kullanıldığında (en azından) çalışmıyor -rwl
ile kombinasyon halinde -s
. Bazı nedenlerden dolayı ikame işlemi hem orijinal hem de kopyalanmış yola uygular. Yani yukarıda, link("dirB/file", "dirB/file")
yerine bazı yapmaya çalışacaktı link("dirA/file", "dirB/file")
.
- FreeBSD'de symlink
pax
türündeki dosyalar için hardlinks oluşturmaz (POSIX tarafından izin verilen bir davranış). Sadece bu değil, ama aynı zamanda yollarda bazı hedeflere ikame (bir davranışı uygular değil POSIX tarafından izin verilir). Yani bir varsa örneğin symlink içinde , bu olacak içinde .foo -> AA
dirA
foo -> BA
dirB
Ayrıca, aynı şeyi ancak içeriğinde depolanan $src
ve rasgele dosya yollarıyla yapmak istiyorsanız , içerideki tam dizin yapısını (var olması ve bir dizin olması gerektiğini) yarattığını $dst
anlamak önemlidir . Örneğin, eğer bir halde, oluşturulur.pax -rwl -- "$src" "$dst"
$src
$dst
$src
foo/bar
$dst/foo/bar
Bunun yerine, $dst
bir kopyasını olmak istiyorsanız $src
, en kolay muhtemelen olarak yapmaktır:
absolute_dst=$(umask 077 && mkdir -p -- "$dst" && cd -P -- "$dst" && pwd -P) &&
(cd -P -- "$src" && pax -rwlpe . "$absolute_dst")
(Bu aynı zamanda yukarıda belirtilen sorunların çoğunun etrafında da çalışacaktır ancak $dst
yeni satır karakterlerinde mutlak sonlar sona ererse başarısız olur ).
Şimdi bu, GNU / Linux sistemlerinde hiçbir şeyin olmadığı yerlerde yardımcı olmaz pax
.
Ve komutlarının pax
özelliklerini birleştirmek için POSIX tarafından oluşturulduğunu not etmek ilginçtir .tar
cpio
cpio
a, tarihsel POSIX buluşa zıt olarak (1977) Unix komut ve hem de bir GNU uygulama (bir olduğu pax
bir). Bu yüzden artık standart bir komut olmasa da (SUSv2'deydi), hala çok yaygındır ve genellikle güvenebileceğiniz temel bir dizi özellik vardır.
Eşdeğeri pax -rwl
olur cpio -pl
. Ancak:
cpio
argümanların tersine stdin'deki girdi dosyalarının listesini alır (newline ile sınırlandırılmış newline karakterleri desteklenmez.
- Tüm dosyalar belirtilmelidir (tipik olarak, bunun çıktısını beslersiniz
find
( find
ve cpio
aynı kişiler tarafından ortaklaşa geliştirilmiştir)).
- meta veriler korunmaz (bazı
cpio
uygulamaların bazılarını korumaya yönelik seçenekleri vardır, ancak taşınabilir bir şey yoktur).
Yani ile cpio
:
absolute_dst=$(umask 077 && mkdir -p -- "$dst" && cd -P -- "$dst" && pwd -P) &&
(cd -P -- "$src" && find . | cpio -pl "$absolute_dst")
pax
FreeBSD'de olduğu gibi , bağlantıcp -a
linklerinin sabit olmadığını da unutmayın.