İki yolun aynı dosyayı gösterip göstermediğini kontrol edin


12

Dosyaları sürüm denetiminde tutmak için ana dizinimde ayarları dizinime yinelemeli olarak semboller oluşturmak için bir komut dosyası var. Zaten bir üst dizin yoluyla symlinked dosyaları atlamak istiyorum. Yani, bu dosyaları / dizinleri varsa:

~/foo/ -> ~/settings/foo/
~/settings/foo/
~/settings/foo/bar

, ~ / foo / bar ve ~ / settings / foo / bar'ın aynı dosya olduğunu nasıl kontrol edebilirim?

Düzenleme : D'oh, aramanın bir kaç dakikası daha cevabı ortaya çıkardı :readlink -f $path

Yanıtlar:


6

İki dosya aynı cihaz kimliği ve inode değerine sahipse, bunlar aynı dosyadır. statKomut satırı aracı bulmak için bu kolaylaştırır

if [ "$(stat -c "%d:%i" FILE1)" == "$(stat -c "%d:%i" FILE2)" ]`

...

bu sembolik dosyalar veya sabit bağlantılı dosyalar için geçerlidir.


5
Sembolik bağlantıları takip etmek için ihtiyacınız var stat -L.
Gilles 'SO- kötü olmayı kes

@Gilles'in dediği gibi, -L anahtarı olmadan, bazı dağıtımlarda yanlış sonuçlar alabilirsiniz
Olaseni

19

Birçok kabuk, iki yolun aynı varolan dosyayı işaret edip etmediğini test etmek -efiçin testyerleşik (veya eşanlamlısı [) için bir işleve sahiptir ( sembolik bağlantıları izleyerek). Buna bash, tire, pdksh, ksh88, ksh93 ve zsh dahildir, ancak POSIX sh dahil değildir. Bash, ksh veya zsh, ayrıca kullanabilirsiniz içinde koşullu yapı.-ef[[ … ]]

if ! [ "$1" -ef "$2" ]; then # $1 and $2 are different files

1
Benim sayfama göre, -ef Rich Homolka'nın cevabı ile aynı şeyi yapıyor.
user13852

2
@ user13852 -efdaha taşınabilir olma avantajına sahiptir (ayrıca biraz daha hızlıdır, ancak çoğu zaman fark edemezsiniz). Örneğin * BSD, OSX, BusyBox ve Linux / Cygwin (GNU) üzerinde çalışır. Tam olarak ne gerekiyorsa yaptığı gibi daha da nettir. statAramaya görebildiğim tek avantaj , sembolik bağlantıları takip etmek istemediğiniz zamandır.
Gilles 'SO- kötü olmayı bırak'

0

Softlinkler için (ile oluşturulmuş ln -s) kullanabilirsiniz realpath. Bu hardlinks için işe yaramaz.

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.