वर्तमान निर्देशिका के सापेक्ष पथ के साथ लिनक्स सीएलआई में पुनरावर्ती सूची दें


224

यह इस प्रश्न के समान है , लेकिन मैं यूनिक्स में वर्तमान निर्देशिका के सापेक्ष पथ को शामिल करना चाहता हूं। यदि मैं निम्नलिखित कार्य करता हूं:

ls -LR | grep .txt

इसमें पूर्ण पथ शामिल नहीं हैं। उदाहरण के लिए, मेरे पास निम्नलिखित निर्देशिका संरचना है:

test1/file.txt
test2/file1.txt
test2/file2.txt

उपरोक्त कोड वापस आ जाएगा:

file.txt
file1.txt
file2.txt

मैं इसे मानक यूनिक्स कमांड का उपयोग करके वर्तमान निर्देशिका के सापेक्ष पथ शामिल करने के लिए कैसे प्राप्त कर सकता हूं?


4
यह सिर्फ दिखाता है कि ls इस सुविधा को याद कर रहा है।
अर्जुन सिंगरी

1
यह शर्म की बात है कि इन सभी समाधानों की आवश्यकता है findया tree। मैं एक एंड्रॉइड डिवाइस में ssh'ing कर रहा हूं जहां मैं केवल दिखाई देता हूं ls, और इनमें से कोई भी अन्य उपकरण नहीं है: /
Pankadoodle

जवाबों:


304

उपयोग खोजें:

find . -name \*.txt -print

जीएनयू खोजने वाले सिस्टम पर, अधिकांश जीएनयू / लिनक्स वितरण की तरह, आप -प्रिंट छोड़ सकते हैं।


11
... और इस मामले के लिए आप 'को छोड़ सकते हैं।'
एडम मित्ज़

7
निरपेक्ष रास्तों के लिए, का उपयोग करेंfind $(pwd) -name \*.txt
ज़ैग्स

2
यदि पैटर्न में निर्देशिका नाम का हिस्सा है, तो -path "*docs/*.txt"इसके बजाय का उपयोग करना चाहिए -name-wholenameके रूप में ही है-path
22

9
-type fकेवल फाइलों को वापस करने के लिए उपयोग करें और निर्देशिकाओं, प्रतीकात्मक लिंक आदि का उपयोग न
करें

2
-name "*.txt"होगा नहीं मेल खाते हैं file.TXT- हमेशा उपयोग -iname "*.txt"के बजाय जो केस-संवेदी है।
ccpizza

73

का प्रयोग करें treeसाथ, -f(पूर्ण पथ) और -i(कोई खरोज लाइनों):

tree -if --noreport .
tree -if --noreport directory/

फिर grepआप अपने इच्छित लोगों को फ़िल्टर करने के लिए उपयोग कर सकते हैं।


यदि आदेश नहीं मिला है, तो आप इसे स्थापित कर सकते हैं:

RHEL / CentOS और Fedora linux पर ट्री कमांड स्थापित करने के लिए निम्नलिखित कमांड टाइप करें:

# yum install tree -y

यदि आप अपने टर्मिनल में डेबियन / उबंटू, मिंट लिनक्स टाइप कमांड का उपयोग कर रहे हैं:

$ sudo apt-get install tree -y

2
केवल फाइलों को सूचीबद्ध करने के लिए कोई सेटिंग, और फ़ोल्डर्स को बाहर करना?
thebugfinder

25

कोशिश करो find। आप इसे बिल्कुल मैन पेज में देख सकते हैं, लेकिन यह इस तरह है:

find [start directory] -name [what to find]

आपके उदाहरण के लिए

find . -name "*.txt"

आपको जो चाहिए वो आपको देना चाहिए।



5

यह चाल है:

ls -R1 $PWD | while read l; do case $l in *:) d=${l%:};; "") d=;; *) echo "$d/$l";; esac; done | grep -i ".txt"

लेकिन ऐसा होता है कि, "पापिंग" के साथ ls, हालांकि, जिसे जीएनयू और घोस्टस्क्रिप्ट समुदायों द्वारा खराब रूप माना जाता है।


2
@CAFEBABE: यह परिणामों को पार्स करने के लिए वर्जित माना जाता है lsक्योंकि यह आम तौर पर कीड़े की ओर जाता है। विचाराधीन वाक्य उस कॉल को कॉल करने का प्रयास कर रहा था। इसमें एक मजाक यह भी था जिसे मैंने हटा दिया है।
एडम काटज़

4
DIR=your_path
find $DIR | sed 's:""$DIR""::'

'sed' सभी 'खोज' परिणामों से 'your_path' को मिटा देगा। और आप 'डीआईआर' पथ के सापेक्ष प्राप्त करते हैं।


यह वास्तव में मैं क्या जरूरत है, लेकिन यह अभी भी मेरे लिए पूरा रास्ता थूकता है?
v3nt

1
एपोस्ट्रोफ का उपयोग न करें - ढूंढें / tmp | sed s: "/ tmp" :: | अधिक
कीरेन डिक्सन

4

खोज कमांड का उपयोग करके वांछित फ़ाइलों का वास्तविक पूर्ण पथ फ़ाइल नाम प्राप्त करने के लिए, इसका उपयोग pwd कमांड के साथ करें:

find $(pwd) -name \*.txt -print

1

यहाँ एक पर्ल स्क्रिप्ट है:

sub format_lines($)
{
    my $refonlines = shift;
    my @lines = @{$refonlines};
    my $tmppath = "-";

    foreach (@lines)
    {
        next if ($_ =~ /^\s+/);
        if ($_ =~ /(^\w+(\/\w*)*):/)
        {
            $tmppath = $1 if defined $1;    
            next;
        }
        print "$tmppath/$_";
    }
}

sub main()
{
        my @lines = ();

    while (<>) 
    {
        push (@lines, $_);
    }
    format_lines(\@lines);
}

main();

उपयोग:

ls -LR | perl format_ls-LR.pl

यह एक भयानक पर्ल प्रोग्राम है। यह शायद 2-3 गुना लंबा है, और जटिल है, की तुलना में यह होना चाहिए।
ब्रैड गिल्बर्ट

1

आप एक शेल फ़ंक्शन बना सकते हैं, जैसे आपके .zshrcया .bashrc:

filepath() {
    echo $PWD/$1
}

filepath2() {
    for i in $@; do
        echo $PWD/$i
    done
}

पहले वाला केवल एकल फाइलों पर काम करेगा, जाहिर है।


1

अपने फ़ाइल सिस्टम पर "फ़ाइल नाम" नामक फ़ाइल को रूट निर्देशिका से खोज शुरू करें "/"। "फ़ाइल नाम"

find / -name "filename" 

1

यदि आप अपने आउटपुट में फ़ाइल आकार आदि जैसे विवरणों को संरक्षित करना चाहते हैं तो यह काम करना चाहिए।

sed "s|<OLDPATH>|<NEWPATH>|g" input_file > output_file

1

में मछली खोल, आप रिकर्सिवली सभी pdfs सूची, वर्तमान निर्देशिका में भी शामिल होते हैं यह कर सकते हैं:

$ ls **pdf

यदि आप किसी भी प्रकार की फाइल चाहते हैं तो बस 'पीडीएफ' हटा दें।


0

आप इस कार्यक्षमता को इस तरह से लागू कर सकते हैं
, सबसे पहले लक्षित निर्देशिका को इंगित ls कमांड का उपयोग करते हुए। बाद में कमांड फ़िल्टर का उपयोग करके इसका परिणाम खोजें। आपके मामले से, ऐसा लगता है - हमेशा फ़ाइल नाम एक शब्द के साथ शुरू होता है file***.txt

ls /some/path/here | find . -name 'file*.txt'   (* represents some wild card search)

0

पेड़ की कमान के साथ, मेरीकेस में

तुलनात्मक पथ

tree -ifF ./dir | grep -v '^./dir$' | grep -v '.*/$' | grep '\./.*' | while read file; do
  echo $file
done

निरपेक्ष मार्ग

tree -ifF ./dir | grep -v '^./dir$' | grep -v '.*/$' | grep '\./.*' | while read file; do
  echo $file | sed -e "s|^.|$PWD|g"
done
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.