GNU cp ve mv'deki -T seçeneğinin katma değeri nedir?


26

Neden bazı GNU Coreutils komutlarının -T/--no-target-directoryseçeneği var? .Geleneksel bir Unix dizin hiyerarşisinde (öz nokta) anlamını kullanarak yapabileceği her şey gibi görünüyor .

Düşünen:

cp -rT /this/source dir

-TSeçenek oluşturmasını kopyasını önler dir/sourcealt dizin. Aksine /this/sourceile tanımlanır dirve içeriği ağaçların arasında buna göre eşlenir. Yani örneğin /this/source/foo.cgider dir/foo.cve benzeri ziyade için dir/source/foo.c.

Ancak bu, aşağıdaki -Tseçeneklerin kullanımı olmadan kolayca yapılabilir:

cp -r /this/source/. dir  # Probably worked fine since dawn of Unix?

Anlamsal olarak, izleyen nokta bileşeni bir çocuk olarak kopyalanır dir, ama elbette "çocuk" zaten var (yani yaratılması gerekmiyor) ve aslında dirkendisidir, bu nedenle etkisi /this/pathile tanımlanır dir.

Geçerli dizin hedef ise, iyi çalışıyor:

cp -r /this/tree/node/. . # node's children go to current dir

Orada bir şey Yapabileceğiniz mı sadece ile -Tvarlığını rasyonalize ki? (Nokta dizini uygulamayan işletim sistemlerine desteğin yanı sıra, belgelerde belirtilmeyen bir gerekçedir.)

Yukarıdaki nokta numarası, GNU Info dokümantasyonunda belirtilen yarış koşullarını çözmüyor -Tmu?

Yanıtlar:


29

Kişisel .bir dizin değil, bir dosya kopyalama yaparken hüner sadece kullanılabilir. -TOpsiyon dizinleri ve dosyaları ile çalışır. Yaparsan:

cp srcfile destfile

ve zaten amaçlanmayan, üzerinde destfilekopyalanacak bir dizin var destfile/srcfile. Yani kullan

cp -T srcfile destfile

ve doğru hatayı alırsınız:

cp: cannot overwrite directory `destfile' with non-directory

.Yöntemi kullanmayı denediyseniz , kopya asla çalışmaz:

cp: cannot stat `srcfile/.`: Not a directory

.Hile yapar sadece aynı zamanda onun basename yeniden adlandırma değilken, bir dosyayı kopyalarken işi! cp /path/to/file /target/dir/. Varsa /target/dir/fileve bir dizinse aynı teşhisi alırsınız! Ancak -Tbunun bir adımda, yarış koşulları olmadan yapamayacağının ne olduğunu gösterdin : bir dosyayı kopyala ve adını bir alt dizine yönlendirilmeden değiştir.
Kaz

3
Aynı değil - .bahsettiğin hüner ekliyordur /.için kaynağı .
Barmar

21

Sorun cp/ mv/ lnbaşlangıçta tasarlanmış gibi bir onlar konum iki komutları (yani kopyasına ve içine kopyalama ).

cp A B

ya da bir B için bir kopyalama ya da B bir kopya ( B / A A kopyasında bağlı olarak) Bbulunmaktadır ve (B bir dizine sembolik ise ve daha fazla varyasyon) bir dizin olup.

Bu kötü çünkü belirsiz. Bu yüzden GNU uygulamaları bu konuda çalışmak için seçenekler ekledi.

cp -T A B

bakılmaksızın A'dan B'ye kopyalar . Varsa Bve bir dizinse, bu başarısız olacaktır (siz geçmediğiniz sürece -r). Her durumda, sen sonuna kadar olmayacak bir ile Adosya içine Bamaçladığınız zaman Akopyalanacak için B.

Ve:

cp -t B A

olduğu içine kopya .


Orijinal unix felsefesi, ne yaptığınızı bildiğinizi varsaymaktır ve mutlulukla kendinizi ayağınızdan vurmanıza izin verecektir.
Lenne

4
@Lenne, ama burada kendini ayağından vurmaktan kaçınmanın bir yolunu vermiyor. Birisi bir B dizini yaratırsa veya çalıştırmadan hemen önce bazı dizine bir link veriyorsa cp A B, komut istediğiniz şeyi yapmayacaktır. Ve [ -e B ] || [ -L B ] || cp A Bhala yapmak cp -Tn A Bzorunda olmayan bir yarış koşulu var.
Stéphane Chazelas

6

-TBir dizin hatalı bir hedef dosya ne olması gerektiği için varsa bir başarısızlık sağlayabilir:

$ mkdir mustbeafile
$ touch afile
$ cp -T afile mustbeafile
cp: cannot overwrite directory `mustbeafile' with non-directory
$ echo $?
1
$ cp afile mustbeafile
$ 

Diğer bir deyişle, beklenmedik bir şekilde bir alt dizine kopyalandığında başarı yerine, bir betiğin iptal edilmesine neden olabilecek bir uyarı ve iyi olmayan bir çıkış durumu oluşur ve bu neden bir dizinin neden olmaması gerektiğini denetler. tek ol.


0

Bir bayrak kullanmak da daha açıktır ve komut el ile girilmek yerine bir komut dosyasında kullanıldığında istenmeyen etki riski daha düşüktür. Bir komut dosyasındaki yollara noktaların eklenmesi her türlü beklenmedik yaramazlıkta sonuçlanabilir.

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.