मनमाने ढंग से फाइल के नाम (न्यूलाइन वर्ण वाले लोगों सहित) से निपटने के लिए, सामान्य चाल की .//.
जगह फाइलों को ढूंढना है .
। क्योंकि //
सामान्य रूप से निर्देशिका ट्री को ट्रेस करते समय नहीं हो सकता है, आप सुनिश्चित हैं कि एक //
संकेत find
(या यहाँ lsattr -R
) उत्पादन में एक नया फ़ाइल नाम की शुरुआत है ।
lsattr -R .//. | awk '
function process() {
i = index(record, " ")
if (i && index(substr(record,1,i), "i"))
print substr(record, i+4)
}
{
if (/\/\//) {
process()
record=$0
} else {
record = record "\n" $0
}
}
END{process()}'
ध्यान दें कि आउटपुट अभी भी अलग हो जाएगा। यदि आपको इसे पोस्ट-प्रोसेस करने की आवश्यकता है, तो आपको इसे अनुकूलित करना होगा। उदाहरण के लिए, आप -v ORS='\0'
इसे GNU को खिलाने में सक्षम होने के लिए जोड़ सकते हैं xargs -r0
।
यह भी ध्यान दें कि lsattr -R
(कम से कम 1.42.13) उन फ़ाइलों के झंडे की सूचना नहीं दे सकता है जिनका पथ PATH_MAX से बड़ा है (आमतौर पर 4096) , इसलिए कोई अपनी माता-पिता की निर्देशिका (या पथ के किसी भी घटक) को आगे बढ़ाकर ऐसी अपरिवर्तनीय फ़ाइल को छिपा सकता है - अपने आप को छोड़कर, जैसा कि यह अपरिवर्तनीय है) एक बहुत गहरी निर्देशिका में।
चारों ओर एक काम के find
साथ उपयोग करना होगा-execdir
:
find . -execdir sh -c '
a=$(lsattr -d "$1") &&
case ${a%% *} in
(*i*) ;;
(*) false
esac' sh {} \; -print0
अब उसके पास -print0
यह पोस्ट-प्रोसेस करने योग्य है, लेकिन यदि आप उन रास्तों के साथ कुछ भी करने का इरादा रखते हैं, तो ध्यान दें कि PATH_MAX से अधिक फ़ाइल पथों पर कोई भी सिस्टम कॉल अभी भी विफल होगा और निर्देशिका घटकों को अंतराल में बदला जा सकता था।
यदि हम एक निर्देशिका ट्री पर एक विश्वसनीय रिपोर्ट प्राप्त करना चाहते हैं जो दूसरों द्वारा संभावित रूप से उपयुक्त है, तो कुछ और मुद्दे अंतर्निहित हैं lsattr
कमांड में जो हमें उल्लेख करने की आवश्यकता है:
- रास्ता
lsattr -R .
से डायरेक्टरी ट्री को ट्रेस किया जाता है, वह रेस की स्थिति के अधीन है। कोई इसे .
सही समय पर सहानुभूति के साथ कुछ निर्देशिकाओं को बदलकर निर्देशिका ट्री के बाहर निर्देशिकाओं में उतर सकता है ।
- यहां तक
lsattr -d file
कि एक दौड़ की स्थिति है। वे विशेषताएँ केवल नियमित फ़ाइलों या निर्देशिकाओं पर लागू होती हैं। तो lsattr
एक करता है lstat()
यह देखना होगा कि फ़ाइल सही प्रकार की होती है और उसके बाद है पहले open()
के बाद ioctl()
विशेषताओं को पुनः प्राप्त करने। लेकिन यह open()
बिना कॉल O_NOFOLLOW
(न ही O_NOCTTY) है। उदाहरण के लिए और सिस्टम को रीबूट file
करने के /dev/watchdog
लिए कोई सिम्लिंक के साथ बदल सकता है । यह दौड़ की स्थितियों से बचने के लिए , और उसके बाद यहां किया जाना चाहिए ।lstat()
open()
open(O_PATH|O_NOFOLLOW)
fstat()
openat()
ioctl()