Nasıl takip ve tamamen sembolik bir zincir rapor edebilirsiniz?

5 Cevap java

Sembolik bir karmaşık yuvalama takip için en iyi araçları / programlama teknikleri nelerdir and completely capturing and reporting on every symlink along the way, including those in the middle of a path (See below for more info).

Burada, belirli bir örnek. Bir kabuk komut şu çıktıyı düşünün

 ls -l /Library/Java/Home
 lrwxr-xr-x  1 root  admin  48 Feb 24 12:58 /Library/Java/Home -> /System/Library/Frameworks/JavaVM.framework/Home

Ls komutu dosya / Library / Java / Ev dosya başka bir konuma sembolik olduğunu bildirir. Ancak, bunu işaret ediyor şey de sembolik olduğunu biliyorum izin vermez

ls -l /System/Library/Frameworks/JavaVM.framework/Home
lrwxr-xr-x  1 root  wheel  24 Feb 24 12:58 /System/Library/Frameworks/JavaVM.framework/Home -> Versions/CurrentJDK/Home

Bu da, size part of the path dosyasına sivri bir sembolik olduğunu biliyorum izin vermez.

ls -l /System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK
lrwxr-xr-x  1 root  wheel  3 Feb 24 12:58 /System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK -> 1.5

Hangi, sadece bu masal tamamlamak için, başka bir sembolik bağdır

ls -l /System/Library/Frameworks/JavaVM.framework/Versions/1.5
lrwxr-xr-x  1 root  wheel  5 Feb 24 12:58 /System/Library/Frameworks/JavaVM.framework/Versions/1.5 -> 1.5.0

Sonunda bir "gerçek" klasörüne işaret.

(Grafiksel olarak veya düz eski metin) bir şekilde sizin için bağlantıları tam zinciri oluşturulabiliyor herhangi bir alet var mı? Ben bir komut verebilecek eminim bu kendileri (ve bunu yapmak ve paylaşmak lütfen! Istiyorsanız), ama o "oh, bok, kenarı durumda. Oh, bok, başka bir ile dolu olacak şey tür gibi görünüyor kenarı durumda ". Ben birileri rahatsız gitti umuyorum.

Ben serbest / sözleşme çalışmaları yapmak, ve herkes bir web sunucu üzerinde PHP uygulamaları yüklemek için biraz daha farklı sembolik kullanır. Biz nerede bizim yeni kodu / modüllerini koymak bilmek yani yarım benim işim genellikle bu (kaçınılmaz olarak) belgelenmemiş hiyerarşi un-yuvalama.

5 Cevap

Tcl bir bağlantı ise "link" return olacak bir komut [dosya türü $ dosya] vardır. Bu ne bağlantı noktaları dönecektir başka bir komut [link dosyası $ dosya] vardır. Bu iki komutları ile bir bağlantı almak ve gerçek bir dosyaya almak kadar bağlantıları takip etmek mümkündür.

Belki de kafamın üst kapalı böyle bir şey:

#!/usr/bin/tclsh

proc dereferenceLink {path {tree {}}} {
    if {[file type $path] == "link"} {
        set pointsTo [file link $path]
        if {[lsearch -exact $tree $path] >= 0} {
            lappend tree $path
            return "[join $tree ->] (circular reference)"
        } else {
            lappend tree $path
            return [dereferenceLink $pointsTo $tree]
        }
    } else {
        lappend tree $path
        return [join $tree "->"]
    }
}

puts [dereferenceLink [lindex $argv 0]]

Sen benziyor çıktıyı alırsınız:

foo-> bar-> baz

Dairesel bir bağlantı varsa bu gibi görünecektir:

foo-> bar-> baz->foo (circular reference)

Eğer döngü içinde tek bir print ekledi eğer bu python komut dosyası, bunu:

http://mail.python.org/pipermail/python-ideas/2007-December/001254.html

İşte ben tam olarak bunu yapmak için bir süre önce birlikte attı bir betik bulunuyor. Bu bağlantıları yürümek için bir sembolik bağ gösterir ls çıktı ">" bulur. Ben (zor örneğin, döngüleri önlemek için on aşağıdaki bağlantıları sonra vazgeçmek kodlanmıştır) kenar durumlarda mükemmel davranış için kefil olamaz, ama bu benim için iyi çalıştı.

#!/bin/bash 

function deref() {

    FILE="${1%/}"
    COUNT=0
    while [ -L "$FILE" ]; do
    	TARGET=`ls -l "$FILE" | sed -e 's/^.*> //'`
    	[ ${TARGET:0:1} == "/" ] || TARGET="`dirname $FILE`/$TARGET"

    	# strip trailing slashes; -L cannot handle those
    	FILE="${TARGET%/}"

    	COUNT=$(( COUNT + 1 ))
    	[ $COUNT -eq 10 ] && exit 1
    done
    echo $FILE

}

deref "$1"

Sadece nihai referent bilmek gerekiyorsa, php yapabilirim realpath işlevi vardır.