ls कमांड: मैं एक पुनरावर्ती पूर्ण पथ सूची, प्रति फ़ाइल एक पंक्ति कैसे प्राप्त कर सकता हूं?


493

मैं पुनरावर्ती एक-प्रति-पथ पथ की एक फ्लैट सूची को थूकने के लिए कैसे प्राप्त कर सकता हूं?

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

/home/dreftymac/.
/home/dreftymac/foo.txt
/home/dreftymac/bar.txt
/home/dreftymac/stackoverflow
/home/dreftymac/stackoverflow/alpha.txt
/home/dreftymac/stackoverflow/bravo.txt
/home/dreftymac/stackoverflow/charlie.txt

ls -a1 लगभग वही करता है जिसकी मुझे आवश्यकता है, लेकिन मुझे पथ के टुकड़े नहीं चाहिए, मुझे पूर्ण पथ चाहिए।


यह भी देखें: पेड़
dreftymac

जवाबों:


386

यदि आप वास्तव में उपयोग करना चाहते हैं ls, तो awk का उपयोग करके इसका आउटपुट प्रारूपित करें:

ls -R /path | awk '
/:$/&&f{s=$0;f=0}
/:$/&&!f{sub(/:$/,"");s=$0;f=1;next}
NF&&f{ print s"/"$0 }'

5
@dreftymac, जिसका अर्थ है कि यह उद्देश्यपूर्ण रूप से बोल रहा है, उस प्रश्न का सही उत्तर जो आपने लिखा है, जानबूझकर या नहीं। हां, संभवतः यह उस प्रश्न का सही उत्तर नहीं था जो आपने लिखे जाने की आशा की थी । और जब मैं आपके बड़े बिंदु से सहमत हूं: "जब चंद्रमा के लिए बुद्धिमान अंक, मूर्ख उंगली को देखता है" यह केवल उचित है कि हम शुद्धता का मूल्यांकन करने के लिए व्यक्तिपरकता के प्रभाव को कम करते हैं, खासकर जब मानदंड में कोई संभावित अस्पष्टता नहीं होती है
लूर्शर

1
@dreftymac, मुझे अपना वोट बदलने में खुशी होगी, लेकिन अब यह बंद है, आपको प्रश्न को संपादित करने की आवश्यकता है ताकि मैं वोट अपडेट कर
सकूं

7
क्या कोई कृपया उपरोक्त awkअभिव्यक्तियाँ समझा सकता है ?
मर्ट नुहोग्लू

2
यह समाधान निर्देशिकाओं को नहीं छोड़ता (प्रत्येक निर्देशिका को अपनी लाइन मिलती है)
JayB

2
धन्यवाद। Btw, यह त्वरित प्रतिलिपि और पेस्ट के लिए 1 पंक्ति में होना अच्छा होगा।
सिंह उफिम्त्सेव

567

उपयोग खोजें:

find .
find /home/dreftymac

यदि आप केवल फ़ाइलें चाहते हैं (निर्देशिकाओं, उपकरणों आदि को छोड़ दें):

find . -type f
find /home/dreftymac -type f

2
lsजैसे पैरामीटर कर सकते हैं--sort=extension इस समाधान द्वारा "भुनाया" हैं?
n611x007 19:28

आवश्यक संदर्भ जानकारी प्रदर्शित करने के लिए आप प्रिंटफ आउटपुट का उपयोग भी कर सकते हैं (उदाहरण के लिए -type f -printf '% p% u \ n')
xsubira

क्या इसे एक फाल्ट के साथ स्वरूपित किया जा सकता है? अर्थात। python pprint.pprint (फाइलें)
नाथन

72

ls -ld $(find .)

यदि आप संशोधन समय के अनुसार अपने उत्पादन को क्रमबद्ध करना चाहते हैं:

ls -ltd $(find .)


11
-बाश: / बिन / एलएस: तर्क सूची बहुत लंबी है
जेरपल्ली

1
+1 ने मेरे लिए 12106 फाइलों के साथ काम किया, और मैं इसके --sort=extensionपैरामीटर का उपयोग कर सकता थाls
n611x007

3
धन्यवाद। मैंने अपने आप से ऐसा नहीं सोचा होगा कि (अच्छा और छोटा) वाक्य-विन्यास - मैंने इस्तेमाल किया होगा find . -name "*" -exec ls -ld '{}' \;(जो भी फाइल की संख्या है वह काम करता है), लेकिन आपका कमांड लिखने के लिए कम है;)
SRG

1
ls -ld $ (ढूंढें।) मेरे लिए टूट जाता है अगर मैं एक ntfs डिस्क सूचीबद्ध कर रहा हूं, जहां फाइलें रिक्त स्थान हैं: ls: उपयोग नहीं कर सकते। / सिस्टम: ऐसी कोई फ़ाइल या निर्देशिका नहीं जो @SRG कार्यों के उद्धरण के साथ मिलें
kuz8

एक छोटा विकल्प (आपकी आवश्यकताओं के आधार पर) होगा find . -ls
इअनस

59

निम्नलिखित सरल तरीके आज़माएं:

find "$PWD"

9
find "`pwd`"यदि पथ में रिक्त स्थान या कुछ अन्य विशेष वर्ण हैं।
मुस्तफा .0x

7
यह किसी से अलग कैसे है find .? -.-
सलमान वॉन अब्बास

7
@SalmanPK यदि आप एक निरपेक्ष रास्ता खोजते हैं जैसे pwdकि शुरुआत के साथ, यह निरपेक्ष पथ मुद्रित करेगा। वैसे, "यह किसी भी तरह से अलग कैसे है find" ;-)
yckart

44

सर्वोत्तम आदेश है: tree -fi

फ़ाइलों का उपयोग करने के लिए लिंक नहीं बल्कि आपको >अपने आउटपुट से हटाना होगा :

tree -fi |grep -v \>

यदि आप प्रत्येक फ़ाइल की प्रकृति जानना चाहते हैं, (उदाहरण के लिए केवल ASCII फ़ाइलों को पढ़ने के लिए) दो whileएस के साथ :

tree -fi | \
grep -v \> | \
while read first ; do 
    file ${first}
done | \
while read second; do 
    echo ${second} | grep ASCII
done

धन्यवाद, मुझे इसके बारे में पता नहीं था tree!
डैन फिलिमोन

@Nakilon निकटतम चीज़ क्या है? क्या यह इसी तरह आउटपुट प्रदर्शित करता है? आप छोटी कमांड के साथ समान आउटपुट को आसानी से कैसे प्रदर्शित करेंगे ?
ओम 01

6
@ om01: ओक्स पर यह एक मुश्किल है brew install tree, क्योंकि आप होमब्रे का उपयोग कर रहे हैं
ccpizza

मैं फ़ाइलों की सूची अनन्य रूप से नहीं दे सका। यह हमेशा निर्देशिकाओं को भी सूचीबद्ध करता है। मैं उसे कैसे कर सकता हूँ?
कोमराधोमर जुने

इस तरह से अधिक मूल्यांकन किया जाना चाहिए!
der_grund

44

ओह, वास्तव में उत्तरों की एक लंबी सूची। इसने बहुत मदद की और आखिरकार, मैंने अपना खुद का निर्माण किया जिसकी मुझे तलाश थी:

एक निर्देशिका और इसके उप-निर्देशिकाओं में सभी फाइलों को सूचीबद्ध करने के लिए:

find "$PWD" -type f

किसी निर्देशिका और उसके उप-निर्देशिका में सभी निर्देशिकाओं को सूचीबद्ध करने के लिए:

find "$PWD" -type d

एक निर्देशिका और इसके उप-निर्देशिकाओं में सभी निर्देशिकाओं और फ़ाइलों को सूचीबद्ध करने के लिए:

find "$PWD"

2
और विस्तार द्वारा फ़िल्टर करने के लिए:find "$PWD" -type f | grep '\.json$'
किलरॉय

2
Grep के साथ पोस्ट-प्रोसेसिंग की कोई आवश्यकता नहीं है, खोजने के लिए इसमें उपयोग करें- जैसे: "$ PWD" -type -name * .json और यदि आप सूचीबद्ध फ़ाइलों को हटाना चाहते हैं: "$ PWD" -type f -name * खोजें .json -exec rm {} \; इसी तरह, यदि आप इसे कॉपी करना चाहते हैं तो आरपी को cp और डेस्टिनेशन से बदलें: -exec cp {} डेस्टिनेशन
गॉडफादर

18

मैं पूरे रास्ते के बारे में नहीं जानता, लेकिन आप -Rपुनरावृत्ति के लिए उपयोग कर सकते हैं । वैकल्पिक रूप से, यदि आप झुकते नहीं हैं, तो आप lsबस कर सकते हैं find *


16

Ls के अलावा अन्य किसी बाहरी कमांड का उपयोग करना:

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


अज्ञात विकल्प '-1'। निरस्त किया जा रहा।
इल्व

15
du -a

कुछ सीमित उपकरण के गोले के लिए आसान जहां खोज / पता उपलब्ध नहीं हैं।


1
किसी भी विचार मैं कैसे wihtout filesize निकाल सकते हैं awk?
अर्नोल्ड रोआ


10

इसे जटिल मत बनाओ। मैंने अभी-अभी इसका उपयोग किया है और एक सुंदर आउटपुट मिला है:

ls -lR /path/I/need

3
ओपी सिर्फ पूरा रास्ता चाहता है और कुछ नहीं। ls -lRउस लक्ष्य को पूरा नहीं करेगा।
codeforester

क्षमा करें, यह ऐसा नहीं करता है
आर्य बेथ

9

आप सभी भावी लोगों के लिए सबसे आसान तरीका बस है:

du

हालाँकि, यह प्रत्येक फ़ोल्डर में मौजूद व्हाट्स के आकार को भी दिखाता है। आप awk का उपयोग केवल फ़ोल्डर नाम के उत्पादन के लिए कर सकते हैं:

du | awk '{print $2}'

संपादित करें- क्षमा करें क्षमा करें, मेरा बुरा। मैंने सोचा कि यह केवल उन फ़ोल्डरों की आवश्यकता थी जो आवश्यक थे। यदि भविष्य में किसी को भी किसी भी तरह की आवश्यकता होती है, तो इसे यहाँ छोड़ दें ...


दिलचस्प है, क्योंकि यह मुझे सामान दिखाता है मुझे नहीं पता था कि मैं जानना चाहता था - Google की तरह। यह पता चला है, मुझे यह जानना पसंद है कि प्रत्येक फ़ाइल कितनी जगह लेती है।
टोरंटो में जेक टोरंटो


9

मुझे लगता है कि एक फ्लैट सूची के लिए सबसे अच्छा तरीका है:

find -D tree /fullpath/to-dir/ 

(या इसे txt फ़ाइल में सहेजने के लिए)

find -D tree /fullpath/to-dir/ > file.txt

3
मैक ओएस 10.13.3 पर कोशिश की। find: illegal option -- D
जयंत भावल


6

यहां एक आंशिक उत्तर है जो निर्देशिका नामों को दिखाता है।

ls -mR * | sed -n 's/://p'

स्पष्टीकरण:

ls -mR * ':' में समाप्त होने वाली पूर्ण निर्देशिका नामों को सूचीबद्ध करता है, फिर अलग से उस निर्देशिका की फ़ाइलों को सूचीबद्ध करता है

sed -n 's/://p' एक रेखा में समाप्त होने वाली रेखाओं को पाता है, बृहदान्त्र को अलग करता है और रेखा को प्रिंट करता है

निर्देशिकाओं की सूची पर पुनरावृत्ति करके, हमें निर्देशिकाओं को खोजने में सक्षम होना चाहिए। फिर भी इस पर काम करते हैं। यह जंगली जानवरों को एक्सगार्स के माध्यम से प्राप्त करने के लिए एक चुनौती है।


महान जवाब .. बिल्कुल मुझे क्या चाहिए!
सेल्विन

5

एक ls निर्देशिका के अंत में एक वाइल्डकार्ड जोड़ना पूर्ण पथ को बाध्य करता है। अभी आपके पास यह है:

$ ls /home/dreftymac/
foo.txt
bar.txt
stackoverflow
stackoverflow/alpha.txt
stackoverflow/bravo.txt
stackoverflow/charlie.txt

आप इसके बजाय ऐसा कर सकते हैं:

$ ls /home/dreftymac/*
/home/dreftymac/.
/home/dreftymac/foo.txt
/home/dreftymac/bar.txt
/home/dreftymac/stackoverflow:
alpha.txt
bravo.txt
charlie.txt

दुर्भाग्य से यह निर्देशिकाओं में पूर्ण पथ को प्रिंट नहीं करता है, इसलिए यह वह पूर्ण समाधान नहीं हो सकता है जिसे आप खोज रहे हैं।


दुर्भाग्य से आप वाइल्डकार्ड के साथ sudo ls नहीं कर सकते हैं (क्योंकि वाइल्डकार्ड सामान्य उपयोगकर्ता के रूप में विस्तारित है)।
andrew lorien

4

बहुत सारे जवाब मैं देख रहा हूं। यह मेरा है, और मुझे लगता है कि यदि आप मैक पर काम कर रहे हैं तो मैं काफी उपयोगी हूं।

मुझे यकीन है कि आप जानते हैं कि कुछ "बंडल" फाइलें ( .app , .rtfd , .workflow , और इसी तरह) हैं। और फाइंडर की विंडो को देखते हुए वे सिंगल फाइल लगते हैं। लेकिन वे नहीं हैं। और $ lsया $ findउन्हें निर्देशिका के रूप में देखें ... इसलिए, जब तक आपको उनकी सामग्री की सूची की आवश्यकता नहीं होती है, यह मेरे लिए काम करता है:

find . -not -name ".*" -not -name "." | egrep -v "\.rtfd/|\.app/|\.lpdf/|\.workflow/"

बेशक यह काम करने वाले डायर के लिए है, और आप अन्य बंडलों के एक्सटेंशन जोड़ सकते हैं (लेकिन हमेशा /उनके बाद)। या किसी भी अन्य एक्सटेंशन के बिना बंडल नहीं है/

बल्कि दिलचस्प है " .lpdf/" (बहुभाषी पीडीएफ)। यह सामान्य " .pdf" विस्तार (!!) या कोई नहीं खोजक में है। इस तरह से आप (या यह सिर्फ 1 फ़ाइल गिनता है) pdfऔर सामान का एक गुच्छा नहीं…


4

ls -lR वह है जो आप खोज रहे थे, या कम से कम मैं था। चियर्स


ओपी सिर्फ पूरा रास्ता चाहता है और कुछ नहीं। ls -lRउस लक्ष्य को पूरा नहीं करेगा।
हैड्रियन TOMA

3

यदि निर्देशिका को एक रिश्तेदार पथ के रूप में पारित किया जाता है और आपको कॉल करने से पहले इसे किसी पूर्ण पथ में परिवर्तित करना होगा। निम्नलिखित उदाहरण में, निर्देशिका को स्क्रिप्ट के पहले पैरामीटर के रूप में पारित किया जाता है:

#!/bin/bash

# get absolute path
directory=`cd $1; pwd`
# print out list of files and directories
find $directory

यदि आपका सिस्टम आपके readlinkपास हैdirectory=$(readlink -e $1)
अगली सूचना तक रोक

सच है, लेकिन सीडी / पीडब्ल्यूडी संयोजन हर प्रणाली पर काम करेगा। readlinkOS X 10.5.8 पर -e विकल्प का समर्थन नहीं करता है।
जॉन कीज़

3
tar cf - $PWD|tar tvf -             

यह धीमा है, लेकिन पुनरावर्ती रूप से काम करता है और निर्देशिकाओं और फ़ाइलों दोनों को प्रिंट करता है। आप इसे awk / grep से पाइप कर सकते हैं यदि आप अन्य सभी जानकारी / निर्देशिकाओं के बिना केवल फ़ाइल नाम चाहते हैं:

tar cf - $PWD|tar tvf -|awk '{print $6}'|grep -v "/$"          

2
आप भी बस का उपयोग कर सकते हैं: tar cvf / dev / null $ PWD
RuleB

2

@ ghostdog74: आपके समाधान के साथ थोड़ा ट्वीक।
निम्नलिखित कोड का उपयोग पूर्ण पूर्ण पथ के साथ फ़ाइल खोजने के लिए किया जा सकता है।

sudo ls -R / | awk '<br/>
/:$/&&f{s=$0;f=0}<br/>
/:$/&&!f{sub(/:$/,"");s=$0;f=1;next}<br/>
NF&&f{ print s"/"$0 }' | grep [file_to_search]

1

मैं फ़ाइल नाम जानता था, लेकिन निर्देशिका भी चाहता था।

$ PWD खोजें | fgrep फ़ाइल नाम

मैक ओएस 10.12.1 में पूरी तरह से काम किया

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