मैं लिनक्स में उनके निरपेक्ष पथ के साथ फ़ाइलों की सूची कैसे बना सकता हूं?


304

मैं एक शेल स्क्रिप्ट लिख रहा हूं जो इनपुट के रूप में फाइल पथ लेता है।

इस कारण से, मुझे पूर्ण पथों के साथ पुनरावर्ती फ़ाइल सूचियाँ जनरेट करने की आवश्यकता है। उदाहरण के लिए, फ़ाइल barमें पथ है:

/home/ken/foo/bar

लेकिन, जहां तक ​​मैं देख सकता हूं, दोनों lsऔर findकेवल रिश्तेदार पथ लिस्टिंग देते हैं:

./foo/bar   (from the folder ken)

यह एक स्पष्ट आवश्यकता की तरह लगता है, लेकिन मैं findया lsमैन पेजों में कुछ भी नहीं देख सकता ।

मैं शेल में फ़ाइलों की एक सूची कैसे बना सकता हूं जिसमें उनके पूर्ण पथ शामिल हैं?


उपयोग:find /home/ken/foo/bar -exec ls -ld $PWD/{} \;
शिक्षार्थी

जवाबों:


305

यदि आप findशुरू करने के लिए एक निरपेक्ष मार्ग देते हैं , तो यह निरपेक्ष पथ मुद्रित करेगा। उदाहरण के लिए, वर्तमान निर्देशिका में सभी .htaccess फ़ाइलों को खोजने के लिए:

find "$(pwd)" -name .htaccess

या यदि आपका शेल $PWDवर्तमान निर्देशिका में फैलता है:

find "$PWD" -name .htaccess

find बस उस पथ को प्रस्तुत करता है जो उस पथ से फ़ाइल के सापेक्ष पथ को दिया गया था।

pwd -Pयदि आप अपनी वर्तमान निर्देशिका में सहानुभूति को हल करना चाहते हैं, तो ग्रेग हेगिल ने भी इसका उपयोग करने का सुझाव दिया ।


9
ध्यान दें कि यदि आप सीमलिंक को हल करना चाहते हैं, तो उपयोग करें pwd -P
ग्रेग हेवगिल

5
यह मददगार है, लेकिन मुझे लगता है कि नीचे user431529 की प्रतिक्रिया अधिक मान्य है: ls -d -1 $PWD/**/*लेकिन मुझे लगता है कि find $PWDयह भी काम करता है (बैश में परीक्षण)
ब्रायन

9
@ ब्रायन क्यों? find $PWDआसान है। lsजादू (जब तक आप यह उपनाम) जटिल और बोझल है। findशेल ग्लोब विस्तार पर निर्भर नहीं है, इसलिए किसी भी शेल में काम करेगा। findऔर भी अधिक लचीला है, मैं सभी फ़ाइलों की पुनरावर्ती सूची प्राप्त कर सकता हूं, या शायद सभी निर्देशिकाओं की, या शायद मैं सभी xml फ़ाइलों की सूची चाहता हूं, या पिछले सप्ताह में बदल गई सभी फाइलें। यह सब संभव है find, लेकिन आसानी से नहीं ls
मैथ्यू शारले जूल

12
मुझे find "`pwd`" -name .htaccessनिर्देशिका नामों में रिक्त स्थान के कारण उपयोग करना पड़ा
पाउलो कासारेटो

मुझे यह नहीं मिला, यह कमांड मुझे फ़ाइल I का पूर्ण पथ नहीं देता है, जबकि सूची में नीचे दिए गए अन्य उत्तर काम करते हैं।
ब्योर्न ओट्टो वासबोटन

202
readlink -f filename 

पूर्ण निरपेक्ष मार्ग देता है। लेकिन अगर फ़ाइल एक सिमलिंक है, तो आपको अंतिम हल किया हुआ नाम मिलेगा।


8
अच्छा लगा। रीडलिंक (यानी मैक) के बीएसडी वेरिएंट पर काम नहीं करता है। मैं मैक पर gnucoreutils का उपयोग करता हूं। और इसलिए greadlink का उपयोग कर सकते हैं जो उपरोक्त समाधान के साथ काम करता है।
शकी

12
मैक ओएस एक्स पर नहीं जाना।
एंड्रयू लाजर

1
@AndrewLazarus - Mac OS X के लिए, realpathइसके बजाय का उपयोग करें
cz

यदि आप के माध्यम से bash टूल स्थापित करते हैं brew install coreutils, तो निष्पादन योग्य के रूप में स्थापित किया जाएगा/usr/local/opt/coreutils/libexec/gnubin/readlink
redolent

121

डायर के लिए इसका उपयोग करें ( /बाद **में इसे निर्देशिका तक सीमित करने के लिए बैश में आवश्यक है):

ls -d -1 "$PWD/"**/

यह उन फ़ाइलों और निर्देशिकाओं के लिए है जो वर्तमान निर्देशिका के अंतर्गत हैं, जिनके नाम में निम्नलिखित हैं .:

ls -d -1 "$PWD/"*.*

यह सब कुछ के लिए:

ls -d -1 "$PWD/"**/*

यहां से लिया गया http://www.zsh.org/mla/users/2002/msg00033.html

**यदि आप सक्षम करते हैं , तो बैश में, पुनरावर्ती है shopt -s globstar


1
ls -d -1 $ PWD / ** / * पुनरावृत्ति नहीं करता है। काश मैं अपना +1 वापस ले सकता। आप प्रत्येक गहराई के लिए ** कर सकते हैं, हालांकि आपको जाने की आवश्यकता है।
user606723 4

4
** ऑपरेटर एक पुनरावर्ती ग्लोबिंग ऑपरेटर है। यदि आप एक शेल में कमांड का उपयोग करते हैं जो इसका समर्थन करता है (जैसे zsh), तो यह ठीक से काम करेगा।
zebediah49

ls -d1 "$ PWD /" / मेरे लिए उत्तर में पुनरावर्ती संस्करण सबफ़ोल्डर्स में फ़ाइलों के लिए निरपेक्ष पथ को प्रस्तुत नहीं करता था।
ज़ेल

मुझे लगता है कि मुझे खोज का उपयोग करना होगा ... मुझे मिलता है -> बैश: / बिन / एलएस: तर्क सूची बहुत लंबी है
टेलामोनएजिसथस

30

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

find $PWD 

बेष में


3
यह वर्तमान निर्देशिका, और इसके नीचे सभी फ़ाइलों और निर्देशिकाओं का मार्ग देगा। शायद वह नहीं है जो लोग ढूंढ रहे हैं।
बिल

18
ls -d "$PWD/"*

यह केवल वर्तमान निर्देशिका में दिखता है । यह "$ PWD" को उद्धृत करता है यदि इसमें रिक्त स्थान होते हैं।


यह अभी भी एक बहुत ही मान्य उत्तर है, लेकिन यह जानकारी शामिल करना अच्छा होगा कि यह पुनरावर्ती रूप से काम नहीं करता है (जो कि मैं वास्तव में देख रहा था!)
bbbco

1
पुनरावर्ती उपयोग के लिए: खोजें। -exec ls -ld $ PWD / {} \;
शिक्षार्थी

10

कमान: ls -1 -d "$PWD/"*

यह नीचे की तरह फ़ाइल के पूर्ण पथ देगा।

[root@kubenode1 ssl]# ls -1 -d "$PWD/"*
/etc/kubernetes/folder/file-test-config.txt
/etc/kubernetes/folder/file-test.txt
/etc/kubernetes/folder/file-client.txt

8

$PWDऊपर मैथ्यू द्वारा एक अच्छा विकल्प है। अगर आप केवल फाइल्स को प्रिंट करना चाहते हैं तो आप केवल सामान्य फाइल्स को सर्च करने के लिए -type f ऑप्शन भी जोड़ सकते हैं। अन्य विकल्प केवल निर्देशिकाओं के लिए "d" हैं आदि। तो आपके मामले में यह होगा (यदि मैं केवल .c के लिए फ़ाइलों के लिए खोज करना चाहता हूं:):

find $PWD -type f -name "*.c" 

या यदि आप सभी फाइलें चाहते हैं:

find $PWD -type f

नोट: आप उपरोक्त आदेश के लिए एक उपनाम नहीं बना सकते, क्योंकि $ PWD आपके घर निर्देशिका में स्वतः पूर्ण हो जाता है, जब उपनाम bash द्वारा सेट किया जा रहा है।


वास्तव में, -d का मतलब केवल निर्देशिका नहीं है - इसका मतलब है कि यह फाइलों की तरह निर्देशिकाओं का व्यवहार करता है। इसलिए यदि आप ls -d / home, आपको "/ home" वापस मिल जाएगा, न कि घर / घर में क्या है इसकी एक सूची।
ट्रैविस

@ ट्राविस: वह एलएस नहीं, बल्कि खोजने के विकल्प के बारे में बात कर रहा था। उनके मामले में "find / -type d" को केवल निर्देशिकाएं मिलेंगी - जैसा कि उन्होंने कहा।
ऑलिगॉफ्रेन

6

यदि आप खोज कमांड को एक पूर्ण पथ देते हैं, तो यह परिणामों को एक पूर्ण पथ के साथ थूक देगा। यदि आप टाइप करना चाहते हैं, तो केन निर्देशिका से:

find /home/ken/foo/ -name bar -print    

(सापेक्ष पथ के बजाय find . -name bar -print)

आपको मिलना चाहिये:

/home/ken/foo/bar

इसलिए, यदि आप चाहते हैं ls -lऔर आपके पास पूर्ण पथ वापस आ गया है, तो आप ls -lजो कुछ भी पाते हैं, उस पर अमल करने के लिए केवल खोज कमांड बता सकते हैं ।

find /home/ken/foo -name bar -exec ls -l {} ;\ 

नोट: के बीच एक स्थान है {}और;

आपको कुछ इस तरह मिलेगा:

-rw-r--r--   1 ken admin       181 Jan 27 15:49 /home/ken/foo/bar

यदि आप सुनिश्चित नहीं हैं कि फ़ाइल कहाँ है, तो आप हमेशा खोज स्थान बदल सकते हैं। जब तक खोज पथ "/" से शुरू होता है, आपको बदले में एक पूर्ण मार्ग मिलेगा। यदि आप एक स्थान (जैसे /) खोज रहे हैं, जहाँ आपको बहुत सी अनुमति से वंचित त्रुटियां होने वाली हैं, तो मैं मानक त्रुटि को पुनर्निर्देशित करने की सलाह दूंगा ताकि आप वास्तव में खोज परिणाम देख सकें:

find / -name bar -exec ls -l {} ;\ 2> /dev/null

( 2>बोर्न और बैश गोले के लिए वाक्यविन्यास है, लेकिन सी शेल के साथ काम नहीं करेगा। यह अन्य गोले में भी काम कर सकता है, लेकिन मैं केवल यह सुनिश्चित करने के लिए जानता हूं कि यह बॉर्न और बैश में काम करता है)।


आप के lsसाथ एक ही प्रक्रिया के लिए कई आर्स पास कर सकते हैं -exec ls -ld {} +। (आप शायद सूची निर्देशिका सामग्री -dनहीं चाहते lsहैं)। या बेहतर, खोजने के lsसाथ में निर्मित का उपयोग करें find ... name bar -ls। इसके अलावा, आपके पास एक arg प्रति कमांड के लिए सिंटैक्स गलत है: आपको शेल से अर्धविराम को उद्धृत करना है, इसलिए यह है {} \;
पीटर कॉर्ड्स

5

fd

का उपयोग करते हुए fd(करने के लिए वैकल्पिक find), निम्न सिंटैक्स का उपयोग करें:

fd . foo -a

.खोज पैटर्न कहां है और fooरूट डायरेक्टरी है।

उदाहरण के लिए etc, पुनरावर्ती रूप से सभी फ़ाइलों को सूचीबद्ध करने के लिए fd . /etc -a:।

-a, --absolute-path सापेक्ष रास्तों के बजाय पूर्ण दिखाओ


2

बस एक विकल्प के लिए

ls -d "$PWD/"* 

खोलना है *, ताकि विस्तार करना है

echo "$PWD/"*

ऐसा ही होगा (ड्राबैक जिसे आप -1नई लाइनों द्वारा अलग करने के लिए उपयोग नहीं कर सकते , रिक्त स्थान नहीं)।


क्या आप इस पर अधिक विस्तार कर सकते हैं? खोल विस्तार क्या है? कैसे -1लाइनों द्वारा अलग करने के लिए उपयोग करने के लिए?
एंटोनियो आराजू

@Antonio Araujo, शेल का विस्तार शेल है (जैसे bash) फ़ाइलों की सूची के साथ * प्रतिस्थापित करेगा - बैश मैन पेज पर अधिक पढ़ सकता है। -1 ls कमांड विकल्प है, इको अन्य कमांड है, इसमें समान विकल्प नहीं हैं।
मारीशा


1

यहाँ एक उदाहरण है कि एक अतिरिक्त अवधि के बिना एक सूची प्रिंट करता है और यह भी दर्शाता है कि फ़ाइल मैच की खोज कैसे करें। उम्मीद है की यह मदद करेगा:

find . -type f -name "extr*" -exec echo `pwd`/{} \; | sed "s|\./||"

1

इसने मेरे लिए काम किया। लेकिन यह वर्णानुक्रम में सूचीबद्ध नहीं था।

find "$(pwd)" -maxdepth 1

यह कमांड वर्णानुक्रम के साथ-साथ छिपी हुई फाइलों को भी सूचीबद्ध करती है।

ls -d -1 "$PWD/".*; ls -d -1 "$PWD/"*;

1

stat

एकल फ़ाइल का पूर्ण पथ:

stat -c %n "$PWD"/foo/bar

1

आप यह कोशिश करना चाह सकते हैं।

for name in /home/ken/foo/bar/*
do
    echo $name
done

आप forलूप का उपयोग करके एब्स पाथ प्राप्त कर सकते हैं और echoबस इसके बिना find


0

यदि आपको वर्तमान की सभी फाइलों के साथ-साथ उप-निर्देशिकाओं की सूची भी चाहिए

find $PWD -type f

यदि आपको केवल वर्तमान निर्देशिका में सभी फ़ाइलों की सूची की आवश्यकता है

find $PWD -maxdepth 1 -type f

0

यह विहित पथ देगा (सहानुभूति का समाधान करेगा): realpath FILENAME

यदि आप स्वयं सिम्नलिन के लिए विहित मार्ग चाहते हैं, तो: realpath -s FILENAME


0

यदि सभी सुझाए गए तरीकों में से अधिकांश उन पथों में परिणत नहीं होते हैं जिनका उपयोग सीधे किसी अन्य टर्मिनल कमांड में नहीं किया जा सकता है यदि पथ में रिक्त स्थान शामिल हैं। आदर्श रूप से परिणामों में पहले से स्लैश होगा। यह मेरे लिए macOS पर काम करता है:

find / -iname "*SEARCH TERM spaces are okay*" -print 2>&1  | grep -v denied |grep -v permitted |sed -E 's/\ /\\ /g'

-1

find / -print ऐसा करेंगे


1
... दुर्भाग्य से यह कुछ और करेगा (जैसे 'कुछ' अन्य फ़ाइलों को प्रदर्शित करने के लिए जब तक फ़िल्टर नहीं किया जाता)
DerMike

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