如何更改 Linux 文件系統解釋我的文件的方式?我的原始碼文件被讀取為“斷開的連結”,儘管它仍然是一個文本文件
在執行一些 make 文件和仿真器進行一些操作後,原始碼文件 (.cc) 被讀取為“斷開的連結”,儘管它仍然是同一個文件。我知道它是正確的文件,因為 (.cc) 文件來自我的 git 儲存庫,並且在那里和其他電腦上, (*.cc) 文件被正確讀取為原始碼文件。此外,我可以通過 git 命令看到
git status
該文件未更改。那麼唯一的結論就是Linux文件系統屬性損壞。如何解決此類錯誤?
下面是在文件上執行的一些命令。
$chmod 777 producer_consumer.cc chmod: cannot operate on dangling symlink ‘producer_consumer.cc’ $lsattr producer_consumer.cc lsattr: Operation not supported While reading flags on producer_consumer.cc $readlink producer_consumer.cc // EPOS Synchronizer Abstraction Test Program #include <utility/ostream.h> #include <thread.h> #include <semaphore.h> #include <alarm.h> using namespace EPOS; const int iterations = 100; OStream cout; const int BUF_SIZE = 16; char buffer[BUF_SIZE]; Semaphore empty(BUF_SIZE); Semaphore full(0); int consumer() { int out = 0; for(int i = 0; i < iterations; i++) { full.p(); cout << "C<-" << buffer[out] << "\t"; out = (out + 1) % BUF_SIZE; Alarm::delay(5000); empty.v(); } return 0; } int main() { Thread * cons = new Thread(&consumer); // producer int in = 0; for(int i = 0; i < iterations; i++) { empty.p(); Alarm::delay(5000); buffer[in] = 'a' + in; cout << "P->" << buffer[in] << "\t"; in = (in + 1) % BUF_SIZE; full.v(); } cons->join(); cout << "The end!" << endl; delete cons; return 0; }
我的linux是這樣的:
Linux Mint 17.3 XCFE - 3.19.0-32-generic #37~14.04.1-Ubuntu SMP Thu Oct 22 09:37:25 UTC 2015 i686 i686 i686 GNU/Linux
這是關於 nautilus 文件管理器上的文件屬性的圖像:
編輯
I have no idea how you ended up with this.
我只是像我一樣弄清楚如何做,並在修復後再次做。我使用的是GUI git工具Smartgit,每次在文件系統上刪除文件file,然後進入Smartgit界面,點擊重置其狀態,(即取消刪除),死灰復燃為那個瘋狂的文件連結。但是陌生人,甚至通過控制台
git status
顯示文件未更改,並且與遠端 git 儲存庫中的文件完全一樣。此外,它不僅在 Smartgit 上,如果通過命令行我這樣做:
git checkout HEAD -- philosophers_dinner.cc
刪除文件後,它又像那個瘋狂的連結那樣死而復生。現在,我可以在這兩個命令中整天玩 linux:
# firstly we delete the file rm philosophers_dinner.cc # this command will break the file git checkout HEAD -- philosophers_dinner.cc # these command will fix the break file by git reset readlink philosophers_dinner.cc > philosophers_dinner.cc.new mv philosophers_dinner.cc{.new,}
一開始我認為它可能是一個過時的 git(我使用的是 1.9.3),然後我更新到 2.9.3,但仍然這樣做。可能是我的 linux 太過時了,Mint 17.3 而不是 18.0,但是當我安裝它時,大多數東西都不像 17.3 那樣工作,然後我又恢復了。
最有趣!
您的
producer_consumer.cc
文件是一個符號連結。但這不是任何舊的符號連結。這是一個帶有完全瘋狂目標的符號連結。這是因為連結的目標是一個非常長的文件名,它恰好(也)是 C++ 程序的整個原始碼。當然,這個符號連結是一個懸空符號連結;對於這樣的符號連結,您看到的 nautilus 和 nautilus的行為head
是完全可以預料的。你沒有提供任何證據來證明存在任何形式的“腐敗”的結論。這是一個完全允許的符號連結,儘管是一個瘋狂的連結。有很多方法可以使用各種普通工具來建立這樣的符號連結。例如,這是使用 shell 替換的初學者練習。
你是如何陷入這種奇怪的混亂的,只有你自己知道,而你沒有向我們透露。你如何擺脫它完全是輕而易舉的事。這是兩個命令,其中一個您大部分已經執行過:
閱讀連結 producer_consumer.cc > producer_consumer.cc.new mv producer_consumer.cc{.new,}
同樣,您如何阻止自己在未來再次陷入困境也是只有您自己知道的事情,因為您已經給了世界零具體資訊,而不僅僅是模糊的“哦,我做了一些事情”的揮手致意。您可能已經執行了一些 makefile,它在某個時候做了一些事情。它可能與此符號連結的存在有關,也可能無關。
所以你可能會再次執行這兩個命令。