टर्मिनल में केवल छिपी हुई फाइलें कैसे दिखाएं?


154

मेरे पास एक निर्देशिका है जिसमें हजारों फाइलें हैं, उनमें से कुछ छिपी हुई हैं।

कमांड ls -aसभी फाइलों को सूचीबद्ध करता है, जिसमें छिपे हुए भी शामिल हैं, लेकिन मुझे केवल छिपी हुई फाइलों को सूचीबद्ध करने की आवश्यकता है।

मुझे किस कमांड का उपयोग करना चाहिए?


1
एक साधारण ls -ld .*या ls -ald .*काम करेगा
जॉन स्ट्रोड

जवाबों:


189

आदेश :

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 

8
आपको वहां दो प्रश्न चिह्न की आवश्यकता नहीं है, * इसे कवर करता है ((केवल किसी एकल वर्ण से मेल खाता है, * उनमें से किसी भी संख्या से मेल खाता है)।
Psusi

13
@psusi, मुझे लगता है कि इरादे को छोड़ने के लिए है .और ..मैच से। हालाँकि यह (पूरी तरह से कानूनी) एकल-वर्ण छिपे हुए फ़ाइलनाम जैसे .a, .1और इसी तरह बाहर कर देगा । शायद एक बेहतर विस्तारित ग्लोब होगा .!(|.)यानी शाब्दिक डॉट कुछ भी नहीं है या किसी अन्य (एकल) के अलावा कुछ के बाद डॉट यानीls -d .!(|.)
steeldriver

@steeldriver, नीट, ?? संस्करण शामिल नहीं है "।" तथा ".."। यह एक दिलचस्प विचित्रता का परिणाम है: न तो? न * एक बिंदी से मेल खाएगा, लेकिन? कुछ से मेल खाना चाहिए अन्यथा नाम को नजरअंदाज कर दिया जाता है।
Psusi

निर्देशिकाओं और फ़ाइलों की पहचान करने के लिए F विकल्प जोड़ें, यानी, ls -ldF? * निर्देशिका नाम में अंतिम प्रदर्शित चरित्र फ़ाइलों के रूप में "/" नहीं है।
आरसीएफ

1
यह लगभग काम करता है सिवाय इसके कि यह भी छिपे हुए फ़ोल्डर की सूची देता है जैसे .vim, जिसे मैं यहां एक फ़ाइल नहीं मानता हूं। मैं इसे ls -ldp की तरह थोड़ा संशोधित करता हूं? * | grep -v / यह एकमात्र सूची छिपी हुई फाइलें छिपी हुई फ़ोल्डर नहीं हैं
फ्रेड यांग

31
ls -d .!(|.)

क्या वास्तव में ओपी की तलाश है।


1
वह कैसे काम करता है?
17 जनवरी को SarcasticSully

सूची निर्देशिका एक के साथ कुछ भी। और एक के बिना कुछ भी सूचीबद्ध न करें कि यह बहुत अधिक अनुवाद है।
पैट्रिक

1
मैं समझता हूं कि !(pattern-list), pattern-listएक या एक से अधिक प्रतिरूपों की एक सूची है |, लेकिन यह मेरे लिए भ्रामक है कि आपके पास बाईं ओर कोई पैटर्न नहीं है |। क्या आप कृपया मुझे वह वाक्य रचना समझा सकते हैं?
कार्लोस मेंडोज़ा

2
@CarlosMendoza खाली पैटर्न बन जाएगा, इसलिए यह ऐसा .नहीं है कि (कुछ भी नहीं .), केवल .खुद को छोड़कर ..
मुरु

16

यदि आप केवल अपनी वर्तमान निर्देशिका (कोई पुनरावृत्ति) में फ़ाइलें चाहते हैं, तो आप कर सकते हैं

echo .[^.]*

यह उन सभी फाइलों के नामों को प्रिंट करेगा जिनके नाम के साथ शुरू होता है .और उसके बाद एक या अधिक गैर-डॉट अक्षर होते हैं। ध्यान दें कि यह उन फ़ाइलों के लिए विफल हो जाएगा, जिनका नाम लगातार डॉट्स से शुरू होता है, इसलिए उदाहरण के लिए ....fooनहीं दिखाया जाएगा।

आप यह भी उपयोग कर सकते हैं find:

find -mindepth 1 -prune -name '.*'

यह -mindepthसुनिश्चित करता है कि हम मेल नहीं खाते .और ऐसे -pruneसाधन जो findउपनिर्देशिका में नहीं उतरेंगे।



4

का उपयोग करते हुए 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 "*"
terdon

3

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 '*~'अप्रासंगिक है। टिल्ड्स में समाप्त होने वाली फाइलें बैकअप फाइलें हैं लेकिन किसी भी तरह से छिपी नहीं हैं।
terdon

@terdon .hiddenफ़ाइल उन फ़ाइलों और फ़ोल्डरों के लिए है, जिन्हें आप तब छुपाना चाहते हैं जब आप डॉट के साथ शुरू करने के लिए फ़ाइल / फ़ोल्डर का नाम नहीं बदल सकते। के रूप में फ़ाइलों के लिए है कि tildes में समाप्त होता है, यह प्रणाली पर निर्भर करता है। ls -Bअधिकांश GUI फ़ाइल खोजकर्ता के रूप में ऐसी फ़ाइलों को अनदेखा कर देंगे।
मार्क एच

cat .hiddenउन फ़ाइलों को दिखा सकते हैं जो अब मौजूद नहीं हैं यदि उन फ़ाइलों को हटा दिया गया है या .hiddenफ़ाइल में जोड़े जाने के बाद से चले गए हैं ।
मार्क एच

यह अच्छा काम करता है।
पेंघे गेंग

2

मुझे लगता है कि आप इसे निम्नलिखित आदेश के साथ कर सकते हैं।

ls -a | grep "^\." | grep -v "^\.$" | grep -v "^\..$"

ls -a आपके द्वारा दर्ज की गई कमांड, जो वर्तमान कार्यशील निर्देशिका में सभी फ़ाइलों और निर्देशिकाओं को दिखाती है।

grep "^\."कमांड मैंने जोड़ा है, जो आउटपुट को केवल छिपी हुई फ़ाइलों को दिखाता है (यह नाम से शुरू होता है ".")।

grep -v "^\.$" | grep -v "^\..$" कमांड मैंने जोड़ा, जो आउटपुट को बाहर करने के लिए फ़िल्टर करता है, .. (वे वर्तमान और मूल निर्देशिका हैं)।

यदि कुछ फ़ाइलनाम के साथ एक पंक्ति से अधिक "\n"हो सकता है, तो ऊपर का उदाहरण गलत हो सकता है।

इसलिए मैं इस मुद्दे को हल करने के लिए आदेश का पालन करने का सुझाव देता हूं।

find -maxdepth 1 -name ".[!.]*"


@ RaduRădeanu मैंने आपकी टिप्पणी देखी, यह बहुत अच्छा है। मैंने अपना जवाब फिर से संपादित किया। आपकी टिप्पणी के लिए धन्यवाद।
xiaodongjie

2

आप और क्या कर सकते थे, 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 .[!.]* .??*और क्यों यह वास्तव में छिपी हुई फ़ाइलें मुद्रण दो बार है, क्योंकि सचमुच आप दो बार पूछ रहे है .??*, .?*, .[!.]*वे एक ही बात कर रहे हैं, इसलिए विभिन्न आदेश पात्रों के साथ उनमें से किसी को जोड़ने दो बार प्रिंट होगा।


1

आप भी उपयोग कर सकते हैं:

ls -d .[!.]* .??*

यह आपको सामान्य छिपी हुई फाइलों और छिपी हुई फाइलों को प्रदर्शित करने की अनुमति देगा, जो उदाहरण के लिए 2 या 3 डॉट्स से शुरू होती हैं: ..hidden_file


1
इसके साथ मुझे सभी छिपी हुई फाइलें दो बार मिलती हैं।
तुकसन

1

आप कमांड का उपयोग कर सकते हैं

ls -Ad .??*

ls -a | grep "^\."समाधानों में grep- आधारित दृष्टिकोण के विपरीत, मल्टी-कॉलम लिस्टिंग की अनुमति देने का लाभ है


1

अब तक के सभी उत्तर इस तथ्य पर आधारित हैं कि फाइलें (या निर्देशिका) जिनका नाम डॉट से शुरू होता है, वे "हिडन" हैं। मैं एक और समाधान के साथ आया, जो शायद उतना कुशल नहीं हो सकता है, लेकिन यह समाधान छिपी हुई फ़ाइलों के नाम के बारे में कुछ भी नहीं मानता है, और इसलिए ..परिणाम में लिस्टिंग से बचा जाता है (जैसा कि वर्तमान में स्वीकृत जवाब है)।

पूरा आदेश है:

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


1
मुझे लगता है कि छिपी हुई फ़ाइलों की परिभाषा बहुत ज्यादा है। यहां तक ​​कि इन छिपी हुई फाइलों की उत्पत्ति .पहले चरित्र के रूप में निपटने के लिए एक बग से होती है।
मुरु

मैं पहले पैराग्राफ में उस (तथ्य के रूप में) उल्लेख करता हूं। हालाँकि यह अभी भी वर्तमान स्वीकृत उत्तर की तुलना में एक अलग परिणाम प्राप्त करता है
alejandro

ज़रूर, यह शामिल नहीं है .., लेकिन मुझे आश्चर्य है कि यह विशेष वर्ण वाले फ़ाइलनाम के साथ कितनी अच्छी तरह काम करता है।
मुरु

मुझे नहीं पता कि आप विशेष पात्रों से क्या मतलब रखते हैं, लेकिन मुझे लगता है कि यह एक समस्या पैदा नहीं करेगा, क्योंकि यह समाधान फ़ाइल नाम के बारे में कुछ भी नहीं मानता है
alejandro

दरअसल, आप कम से कम एक बात तो मान लेते हैं: फाइलनेम में नयापन नहीं है। इसके अलावा: फ़ाइल नाम में उन दृश्यों से बच नहीं है जो echo -eव्याख्या करेंगे। इसके अलावा: lsफाइलनाम को मैनज नहीं करेंगे ताकि दो अलग-अलग फ़ाइलनामों को एक ही प्रदर्शित किया जा सके (उदाहरण के लिए, कुछ संस्करणों में विशेष वर्णों के लिए lsउपयोग ?किया जाएगा , इसलिए .foo\tbar( \t=> टैब) और .foo\nbar( \n=> newline) दोनों ही प्रदर्शित होंगे foo?bar)।
मुरु

1

वैकल्पिक रूप से, आप भी उपयोग कर सकते हैं 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:~$ 

0

बैश के साथ, GLOBIGNOREविशेष चर सेट करना कुछ गैर-खाली मूल्य है जो इसे अनदेखा करने .और ..ग्लोब का विस्तार करने के लिए पर्याप्त है । से बैश डॉक्स :

GLOBIGNOREखोल चर एक पैटर्न मिलान फ़ाइल नाम के सेट को प्रतिबंधित करने के लिए इस्तेमाल किया जा सकता है। यदि GLOBIGNOREसेट किया जाता है, तो प्रत्येक मिलान फ़ाइलनाम जो किसी एक पैटर्न GLOBIGNOREसे मेल खाता है, को मैचों की सूची से हटा दिया जाता है। यदि nocaseglobविकल्प सेट किया गया है, तो GLOBIGNOREमामले के संबंध में पैटर्न के खिलाफ मिलान किया जाता है। फ़ाइलनाम .और ..हमेशा अनदेखा किया GLOBIGNOREजाता है जब सेट किया जाता है और अशक्त नहीं होता है। हालांकि, GLOBIGNOREएक गैर-शून्य मान पर सेट करने से डॉटग्लोब शेल विकल्प को सक्षम करने का प्रभाव पड़ता है, इसलिए ‘.'के साथ शुरू होने वाले अन्य सभी फ़ाइलनाम मेल खाएंगे।

हम करने के लिए यह सेट करते हैं .:.., दोनों .और ..नजरअंदाज कर दिया जाएगा। चूँकि इसे कुछ भी अशक्त करने के लिए यह व्यवहार मिलेगा, इसलिए हम इसे केवल निर्धारित कर सकते हैं.

इसलिए:

GLOBIGNORE=.
ls -d .*
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.