Unix: Dizin adlarından sonra eğik çizgi


13

Aşağıdaki komutlar arasındaki fark nedir?

mv foo bar
mv foo/ bar/
mv foo/ bar
mv foo bar/

Yoksa fark yok mu? Yoksa kullanılan komuta mı bağlı? Örneğin, rsync davranışının kullandığınız sürüme bağlı olarak biraz değiştiğini okudum. Kimsenin iyi bir açıklaması var, bu yüzden artık tahmin etmem ve ne yaptığımı bildiğimi hissetmem gerekmiyor mu?


2
Rsync için bu doğru. Kopyalamayı, sırasıyla eğik çizgiyi atlayıp atlamamanıza veya eklemenize bağlı olarak, dizinin kendisiyle veya altındaki öğelerle başlatır.
maxelost

@maxelost: Bazı örneklerle bir cevap ekleyebilir misiniz?
Svish

Mikel, aşağıda oldukça net bir şekilde yanıtladı.
maxelost

Yanıtlar:


17

Birçok Unix yardımcı programı, izleri eğik çizgi olup olmamasına bağlı olarak farklı şekilde ele alır.

Bu davranış POSIX Sembolik Bağlantı belgelerinde açıklanır ve GNU coreutils belgelerinde de belirtilir .

Temel olarak, sondaki eğik çizgi, sembolik çizgiyi takip etmek (veya "dereference") anlamına gelir.

Örneğin, aşağıdaki kodda dirlink, sembolik bağlantı dirlink/anlamına gelir , ancak sembolik bağın işaret ettiği dizin anlamına gelir. rmsiz söylemediğiniz sürece bir dizini kaldırmaz rm -r, ancak rmseçenekler olmadan bir sembolik bağlantı mutlu bir şekilde kaldırılır.

$ mkdir dir
$ ln -s dir dirlink
$ ls -l
total 4
drwxr-xr-x 2 mikel mikel 4096 2011-02-02 22:26 dir
lrwxrwxrwx 1 mikel mikel    3 2011-02-02 22:26 dirlink -> dir
$ ls -l
total 4
drwxr-xr-x 2 mikel mikel 4096 2011-02-02 22:26 dir
lrwxrwxrwx 1 mikel mikel    3 2011-02-02 22:26 dirlink -> dir
$ rm dirlink/
rm: cannot remove `dirlink/': Is a directory
$ rm dirlink
$ ls -l
total 4
drwxr-xr-x 2 mikel mikel 4096 2011-02-02 22:26 dir

Ayrıca, dizinin gerçek bir dizin mi, yoksa yalnızca bir dizine bir sembol bağlantısı mı olduğunu sormak zorunda kalmadan bir dizinin izinlerini görüntülemek için de yararlıdır.

$ ls -ld dirlink
lrwxrwxrwx 1 mikel mikel 3 2011-02-02 22:46 dirlink -> dir
$ ls -ld dirlink/
drwxr-xr-x 2 mikel mikel 4096 2011-02-02 22:46 dirlink/

ve hala düzenli dizinler için çalışıyor:

$ ls -ld dir
drwxr-xr-x 2 mikel mikel 4096 2011-02-02 22:46 dir
$ ls -ld dir/
drwxr-xr-x 2 mikel mikel 4096 2011-02-02 22:46 dir/

Başka bir örnek findkomuttur. Aramasını pathisterseniz bir sembolik bağlantı varsa, varsayılan olarak sembolik bağlantıyı izlemez, yani yalnızca sembolik bağlantıyı işler. Sondaki eğik çizgi eklenmesi, sembolik bağın, bağlantının işaret ettiği dizin olarak değerlendirilmesini sağlar.

$ find dir
dir
dir/file
$ find dirlink
dirlink
$ find dirlink/
dirlink/
dirlink/file

(bulmanın bazı sürümlerinde bir -followveya -Lseçenek bulunur, ancak bu yalnızca ilkini değil, tüm simgeleri takip eder)


rsyncEğik çizgi eklemeniz gerekip gerekmediği durumda, kopyaladığınız dizinin bir alt dizin olmasını isteyip istemediğinize bağlıdır.

$ mkdir dir
$ touch dir/file
$ rsync -r dir dir.bak
$ find .
.
./dir
./dir/file
./dir.bak
./dir.bak/dir
./dir.bak/dir/file
$ rm -r dir.bak
$ rsync -r dir/ dir.bak
$ find .
.
./dir
./dir/file
./dir.bak
./dir.bak/file

Diğer bir deyişle:

  • rsync dir dir.bakkopyalar diriçine dir.bak, yapım dirdir.bak
  • rsync dir/ dir.baktüm içeriği kopyalar diryapmadan, diriçinidir.bak

2

Jsalonen'in daha önce de söylediği gibi, bu komutlar aslında dizinler ise foove aslında aynı sonuçlara sahiptir bar.

Ancak, foove eğer bardizin değilse, sondaki eğik çizgi eklerseniz komut başarısız olur ve girmezseniz başarılı olur. Şey, komut başarılı olursa, muhtemelen istediğiniz sonucu vermeyecektir. Aslında foove eğer bardosyalar ise veri kaybedebilirsiniz ( barüzerine yazılır).

Niyetinizi dizinleri değil dosyaları belirtmek için ise, o zaman gerektiğini bunun komut daha sağlam hale getirir, çünkü eğik çizgi kullanmayın: o beklenti eğer fooya bardizinleri vardır başarısız sonra komut yerine beklenmeyen sonuçlar kalmadan, incelikle başarısız olur.

Ayrıca, bazı (nadir) komutlar, dizinlerde bile olsa, bir eğik çizginin varlığına bağlı olarak farklı davranır (bir örnek rsync).


Evet, ima ettiğim gibi, komutlar iyi eğik çizgileri idare edebilir veya etmeyebilir. Örnek olarak rsync sağlamanız çok iyi!
jsalonen
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.