我需要讓Perl從Linux路徑中移除相對路徑組件。我發現幾乎幾乎所有我想要的功能,但是:如何刪除相對路徑組件,但在Perl中只保留符號鏈接?
File::Spec->rel2abs
確實太少了。它不能正確解析「..」到目錄中。
Cwd::realpath
確實太多了。它解決了我不想要的路徑中的所有符號鏈接。
也許最好的方式來說明我多麼希望這個函數的行爲是發佈一個bash日誌,其中FixPath是一個假設的命令,讓所需的輸出:
'/tmp/test'$ mkdir -p a/b/c1 a/b/c2
'/tmp/test'$ cd a
'/tmp/test/a'$ ln -s b link
'/tmp/test/a'$ ls
b link
'/tmp/test/a'$ cd b
'/tmp/test/a/b'$ ls
c1 c2
'/tmp/test/a/b'$ FixPath . # rel2abs works here
===> /tmp/test/a/b
'/tmp/test/a/b'$ FixPath .. # realpath works here
===> /tmp/test/a
'/tmp/test/a/b'$ FixPath c1 # rel2abs works here
===> /tmp/test/a/b/c1
'/tmp/test/a/b'$ FixPath ../b # realpath works here
===> /tmp/test/a/b
'/tmp/test/a/b'$ FixPath ../link/c1 # neither one works here
===> /tmp/test/a/link/c1
'/tmp/test/a/b'$ FixPath missing # should work for nonexistent files
===> /tmp/test/a/b/missing
我很確定你不會準確地找到你需要的東西。爲什麼你需要單獨的鏈接?另外,你將如何處理符號鏈接,其中包含./../../bin/twiddle/../其中,實際上,twiddle是一個符號鏈接,可以/任意/其他/路徑(或任意/路徑/從/在這裏)。另外,你希望在符號鏈接路徑中使用循環,或者其他類似的操作。 – 2010-04-27 01:36:21
我很滿意這種情況下的解決方案(例如'./../../ bin/twiddle /../ there'成爲'/ tmp/test/bin/there')。它不應該永遠需要讀取符號鏈接。如果這樣的功能不存在(我開始明白爲什麼...),那麼我會寫它。 – jnylen 2010-04-27 01:40:44
如果您只是想將「foo /../ bar」翻譯爲「bar」,那就這麼做 - 但這不是一般的文件系統操作;因此缺乏支持。 – jrockway 2010-04-27 01:43:40