जवाबों:
आदेश :
ls -ld .?*
केवल छिपी हुई फाइलों को सूचीबद्ध करेगा।
समझाएँ:
-l use a long listing format
-d, --directory
list directory entries instead of contents, and do not derefer‐
ence symbolic links
.?* will only state hidden files
.
और ..
मैच से। हालाँकि यह (पूरी तरह से कानूनी) एकल-वर्ण छिपे हुए फ़ाइलनाम जैसे .a
, .1
और इसी तरह बाहर कर देगा । शायद एक बेहतर विस्तारित ग्लोब होगा .!(|.)
यानी शाब्दिक डॉट कुछ भी नहीं है या किसी अन्य (एकल) के अलावा कुछ के बाद डॉट यानीls -d .!(|.)
ls -d .!(|.)
क्या वास्तव में ओपी की तलाश है।
!(pattern-list)
, pattern-list
एक या एक से अधिक प्रतिरूपों की एक सूची है |
, लेकिन यह मेरे लिए भ्रामक है कि आपके पास बाईं ओर कोई पैटर्न नहीं है |
। क्या आप कृपया मुझे वह वाक्य रचना समझा सकते हैं?
.
नहीं है कि (कुछ भी नहीं .
), केवल .
खुद को छोड़कर ..
।
यदि आप केवल अपनी वर्तमान निर्देशिका (कोई पुनरावृत्ति) में फ़ाइलें चाहते हैं, तो आप कर सकते हैं
echo .[^.]*
यह उन सभी फाइलों के नामों को प्रिंट करेगा जिनके नाम के साथ शुरू होता है .
और उसके बाद एक या अधिक गैर-डॉट अक्षर होते हैं। ध्यान दें कि यह उन फ़ाइलों के लिए विफल हो जाएगा, जिनका नाम लगातार डॉट्स से शुरू होता है, इसलिए उदाहरण के लिए ....foo
नहीं दिखाया जाएगा।
आप यह भी उपयोग कर सकते हैं find
:
find -mindepth 1 -prune -name '.*'
यह -mindepth
सुनिश्चित करता है कि हम मेल नहीं खाते .
और ऐसे -prune
साधन जो find
उपनिर्देशिका में नहीं उतरेंगे।
का उपयोग करते हुए find
और awk
,
find . -type f | awk -F"/" '$NF ~ /^\..*$/ {print $NF}'
स्पष्टीकरण:
find . -type f
-> वर्तमान निर्देशिका में सभी फाइलों को सूचीबद्ध करें, जैसे कि यह रास्ता है,
./foo.html
./bar.html
./.foo1
awk -F"/" '$NF ~ /^\..*$/ {print $NF}'
/
फ़ील्ड विभाजक के रूप में एक डॉट के साथ अंतिम फ़ील्ड घूरने के लिए चेक जागता है या नहीं। यदि यह एक बिंदु से शुरू होता है, तो यह उस संबंधित रेखा के अंतिम क्षेत्र को प्रिंट करता है।
find -type f
। आपको खोज पथ को स्पष्ट रूप से सेट करने की आवश्यकता नहीं है या -name "*"
।
find
आमतौर पर नाम ग्लोबिंग का उपयोग करने की तुलना में जटिल खोजों के लिए एक बेहतर विकल्प है।
find . -mindepth 1 -maxdepth 1 -name '.*'
या
find . -mindepth 1 -maxdepth 1 -name '.*' -o -name '*~'
find .
वर्तमान निर्देशिका खोजता है
-mindepth 1
बाहर कर देता है। और .. सूची से
-maxdepth 1
खोज को वर्तमान निर्देशिका तक सीमित करता है
-name '.*'
फ़ाइल नाम खोजें जो डॉट से शुरू होते हैं
-o
या
-name '*~'
एक टिल्ड के साथ समाप्त होने वाले फ़ाइल नाम खोजें (आमतौर पर, ये टेक्स्ट एडिटिंग प्रोग्राम से बैकअप फाइलें हैं)
हालाँकि, यह और अन्य सभी उत्तर उन फ़ाइलों को याद करते हैं जो वर्तमान निर्देशिका की .hidden
फ़ाइल में हैं। यदि आप एक स्क्रिप्ट लिख रहे हैं, तो ये लाइनें .hidden
फ़ाइल को पढ़ेगी और जो मौजूद हैं उनके फ़ाइल नाम प्रदर्शित करेंगी ।
if [[ -f .hidden]] # if '.hidden' exists and is a file
then
while read filename # read file name from line
do
if [[ -e "$filename" ]] # if the read file name exists
then
echo "$filename" # print it
fi
done < .hidden # read from .hidden file
fi
.hidden
फाइल क्या है ? कभी कोई फ़ाइल क्यों होगी .hidden
जिसमें फ़ाइल नाम शामिल हों? वैसे भी, अगर कोई एक है तो आप उस जटिल चीज़ को क्यों करेंगे जब आपको ज़रूरत होगी cat .hidden
? आपकी find
आज्ञा सही है (ईश) लेकिन -name '*~'
अप्रासंगिक है। टिल्ड्स में समाप्त होने वाली फाइलें बैकअप फाइलें हैं लेकिन किसी भी तरह से छिपी नहीं हैं।
.hidden
फ़ाइल उन फ़ाइलों और फ़ोल्डरों के लिए है, जिन्हें आप तब छुपाना चाहते हैं जब आप डॉट के साथ शुरू करने के लिए फ़ाइल / फ़ोल्डर का नाम नहीं बदल सकते। के रूप में फ़ाइलों के लिए है कि tildes में समाप्त होता है, यह प्रणाली पर निर्भर करता है। ls -B
अधिकांश GUI फ़ाइल खोजकर्ता के रूप में ऐसी फ़ाइलों को अनदेखा कर देंगे।
cat .hidden
उन फ़ाइलों को दिखा सकते हैं जो अब मौजूद नहीं हैं यदि उन फ़ाइलों को हटा दिया गया है या .hidden
फ़ाइल में जोड़े जाने के बाद से चले गए हैं ।
मुझे लगता है कि आप इसे निम्नलिखित आदेश के साथ कर सकते हैं।
ls -a | grep "^\." | grep -v "^\.$" | grep -v "^\..$"
ls -a
आपके द्वारा दर्ज की गई कमांड, जो वर्तमान कार्यशील निर्देशिका में सभी फ़ाइलों और निर्देशिकाओं को दिखाती है।
grep "^\."
कमांड मैंने जोड़ा है, जो आउटपुट को केवल छिपी हुई फ़ाइलों को दिखाता है (यह नाम से शुरू होता है "."
)।
grep -v "^\.$" | grep -v "^\..$"
कमांड मैंने जोड़ा, जो आउटपुट को बाहर करने के लिए फ़िल्टर करता है, .. (वे वर्तमान और मूल निर्देशिका हैं)।
यदि कुछ फ़ाइलनाम के साथ एक पंक्ति से अधिक "\n"
हो सकता है, तो ऊपर का उदाहरण गलत हो सकता है।
इसलिए मैं इस मुद्दे को हल करने के लिए आदेश का पालन करने का सुझाव देता हूं।
find -maxdepth 1 -name ".[!.]*"
ls
करना चाहिए ।
आप और क्या कर सकते थे, is ls .?*
या ls .!(|)
जो आपको वर्तमान डीआईआर छुपी हुई फाइलों में सब कुछ दिखाएगा / शीर्ष और अन्य फाइलों पर डायर / नीचे दी गई फाइलें
जैसे: मेरे टर्मिनल से
$ ls .?*
.bash_history .dmrc .macromedia .weather
.bash_logout .gksu.lock .profile .wgetrc
.bash_profile .bashrc.save .ICEauthority .toprc .Xauthority
.bashrc .lastdir .viminfo .xsession-errors
.bashrc~ .dircolors .lynxrc .vimrc .xsession-errors.old
..:
Baron
.adobe:
Flash_Player
.aptitude:
cache config
.cache:
compizconfig-1 rhythmbox
dconf shotwell
अब उपर्युक्त परिणामों में ध्यान दें, यह आपको हर फाइल को दिखाता है / उसकी उपडिर और नीचे किसी छिपी हुई फाइल के साथ।
[1:0:248][ebaron@37signals:pts/4][~/Desktop]
$ ls .!(|)
.bash_aliases .bashrc1 .bashrc1~
..:
askapache-bash-profile.txt examples.desktop Public top-1m.csv
backups Firefox_wallpaper.png PycharmProjects top-1m.csv.zip
Desktop java_error_in_PYCHARM_17581.log Shotwell Import Log.txt topsites.txt
Documents Music Templates Videos
Downloads Pictures texput.log vmware
क्षमा करें, मैं टिप्पणी नहीं कर सकता। के बीच यहां अंतर समझाने के लिए ls .?*
और @ cioby23 जवाब ls -d .[!.]* .??*
और क्यों यह वास्तव में छिपी हुई फ़ाइलें मुद्रण दो बार है, क्योंकि सचमुच आप दो बार पूछ रहे है .??*
, .?*
, .[!.]*
वे एक ही बात कर रहे हैं, इसलिए विभिन्न आदेश पात्रों के साथ उनमें से किसी को जोड़ने दो बार प्रिंट होगा।
अब तक के सभी उत्तर इस तथ्य पर आधारित हैं कि फाइलें (या निर्देशिका) जिनका नाम डॉट से शुरू होता है, वे "हिडन" हैं। मैं एक और समाधान के साथ आया, जो शायद उतना कुशल नहीं हो सकता है, लेकिन यह समाधान छिपी हुई फ़ाइलों के नाम के बारे में कुछ भी नहीं मानता है, और इसलिए ..
परिणाम में लिस्टिंग से बचा जाता है (जैसा कि वर्तमान में स्वीकृत जवाब है)।
पूरा आदेश है:
ls -d $(echo -e "$(\ls)\n$(\ls -A)" | sort | uniq -u)
व्याख्या
यह जो करता है वह सभी फाइलों (और निर्देशिकाओं) को दो बार सूचीबद्ध करता है,
echo -e "$(\ls)\n$(\ls -A)"
लेकिन केवल एक बार छिपी हुई फाइलें दिखा रहा है -A
।
फिर सूची को सॉर्ट | sort
किया जाता है जो नियमित (अनहेल्दी) फाइल दो बार और एक दूसरे के बगल में दिखाई देती है।
फिर, उन सभी लाइनों को हटा दें जो एक से अधिक बार दिखाई देती हैं | uniq -u
, केवल अद्वितीय लाइनें छोड़ रही हैं।
अंत ls
में उपयोगकर्ता के कस्टम विकल्पों के साथ सभी फ़ाइलों को सूचीबद्ध करने और सूची में निर्देशिकाओं की सामग्री को सूचीबद्ध किए बिना फिर से उपयोग करें -d
।
EDIT (सीमाएँ):
जैसा कि मुरू ने कहा है, यह समाधान सही ढंग से काम नहीं करेगा यदि नाम के साथ फाइल हैं escaped\ncharacter.txt
क्योंकि echo -e
फ़ाइल नाम को दो लाइनों में विभाजित करेगा। यह भी रूप में की उम्मीद करता है, तो इस तरह के रूप में एक विशेष वर्ण, के अलावा लगभग ही नाम के दो छिपी हुई फ़ाइलें हैं काम नहीं करेगा .foo[tab].txt
और .foo[new-line].txt
के रूप में उन दोनों के रूप में मुद्रित कर रहे हैं .foo?.txt
और के द्वारा समाप्त किया जाएगाuniq -u
.
पहले चरित्र के रूप में निपटने के लिए एक बग से होती है।
..
, लेकिन मुझे आश्चर्य है कि यह विशेष वर्ण वाले फ़ाइलनाम के साथ कितनी अच्छी तरह काम करता है।
echo -e
व्याख्या करेंगे। इसके अलावा: ls
फाइलनाम को मैनज नहीं करेंगे ताकि दो अलग-अलग फ़ाइलनामों को एक ही प्रदर्शित किया जा सके (उदाहरण के लिए, कुछ संस्करणों में विशेष वर्णों के लिए ls
उपयोग ?
किया जाएगा , इसलिए .foo\tbar
( \t
=> टैब) और .foo\nbar
( \n
=> newline) दोनों ही प्रदर्शित होंगे foo?bar
)।
वैकल्पिक रूप से, आप भी उपयोग कर सकते हैं echo .*
जैसे
user@linux:~$ echo .*
. .. .bash_aliases .bash_history .bash_logout .bashrc
user@linux:~$
यदि आप इसे लंबी सूची प्रारूप में पसंद करते हैं, तो बस सफेद स्थान को एक नई पंक्ति में परिवर्तित करें।
user@linux:~$ echo .* | tr ' ' '\n'
.
..
.bash_aliases
.bash_history
.bash_logout
.bashrc
user@linux:~$
बैश के साथ, GLOBIGNORE
विशेष चर सेट करना कुछ गैर-खाली मूल्य है जो इसे अनदेखा करने .
और ..
ग्लोब का विस्तार करने के लिए पर्याप्त है । से बैश डॉक्स :
GLOBIGNORE
खोल चर एक पैटर्न मिलान फ़ाइल नाम के सेट को प्रतिबंधित करने के लिए इस्तेमाल किया जा सकता है। यदिGLOBIGNORE
सेट किया जाता है, तो प्रत्येक मिलान फ़ाइलनाम जो किसी एक पैटर्नGLOBIGNORE
से मेल खाता है, को मैचों की सूची से हटा दिया जाता है। यदिnocaseglob
विकल्प सेट किया गया है, तोGLOBIGNORE
मामले के संबंध में पैटर्न के खिलाफ मिलान किया जाता है। फ़ाइलनाम.
और..
हमेशा अनदेखा कियाGLOBIGNORE
जाता है जब सेट किया जाता है और अशक्त नहीं होता है। हालांकि,GLOBIGNORE
एक गैर-शून्य मान पर सेट करने से डॉटग्लोब शेल विकल्प को सक्षम करने का प्रभाव पड़ता है, इसलिए‘.
'के साथ शुरू होने वाले अन्य सभी फ़ाइलनाम मेल खाएंगे।
हम करने के लिए यह सेट करते हैं .:..
, दोनों .
और ..
नजरअंदाज कर दिया जाएगा। चूँकि इसे कुछ भी अशक्त करने के लिए यह व्यवहार मिलेगा, इसलिए हम इसे केवल निर्धारित कर सकते हैं.
इसलिए:
GLOBIGNORE=.
ls -d .*
ls -ld .*
याls -ald .*
काम करेगा