निरपेक्ष रास्तों वाली निर्देशिका की सभी फाइलों को कैसे सूचीबद्ध करें


30

मुझे एक फ़ाइल (अधिमानतः एक .list फ़ाइल) की आवश्यकता है जिसमें एक निर्देशिका में हर फ़ाइल का पूर्ण पथ शामिल है।

उदाहरण dir1: file1.txt file2.txt file3.txt

listOfFiles.list:

/Users/haddad/dir1/file1.txt
/Users/haddad/dir1/file2.txt
/Users/haddad/dir1/file3.txt

मैं इसे लिनक्स / मैक में कैसे पूरा कर सकता हूं?

जवाबों:


30
ls -d "$PWD"/* > listOfFiles.list

क्या यह लाल टोपी में काम करेगा?
अरबियन_लबर्ट

4
यह कमांड किसी भी लिनक्स या यूनिक्स ऑपरेटिंग सिस्टम में काम करता है। यदि आप प्रति पंक्ति एक फ़ाइल प्राप्त करना चाहते हैं, तो आपको उपयोग करना होगाls -d -1 $PWD/*
MelBurslan

1
यदि आपकी फ़ाइल के नाम लंबे हैं या टर्मिनल की चौड़ाई संकीर्ण है, तो हाँ, यह मामला होगा, लेकिन कहते हैं कि आपने पूरी स्क्रीन पर कब्जा करने के लिए टर्मिनल विंडो को अधिकतम कर दिया है या आपके फ़ाइल नाम (पथ सहित) वास्तव में कम हैं, जो पकड़ में नहीं आएंगे सच। -1विकल्प की गारंटी है कि आपको प्रति पंक्ति एक फ़ाइल नाम मिल सकता है
मेलबर्सलान

7
@MelBurslan की आवश्यकता केवल तभी होती है जब आउटपुट एक शब्दावली में होता है। lsपता लगाता है कि आउटपुट फाइल या टर्मिनल में है।
रनियम

9
यदि निर्देशिका में कई हज़ारों फाइलें हैं, तो यह विफल हो जाएगा, अर्थात अधिकतम कमांड लाइन आकार को पार करने के लिए पर्याप्त (इस तथ्य से अधिक संभावना है कि शेल पूर्ण पथ के साथ फ़ाइल नाम का विस्तार कर रहा है)। @Andy Dalton का findजवाब एक बेहतर समाधान है, क्योंकि यह कोई फर्क नहीं पड़ता कि कितनी फाइलों को सूचीबद्ध किया जाना है।
कैस

33

आप पा सकते हैं। यह मानते हुए कि आप केवल नियमित फ़ाइलें चाहते हैं, आप कर सकते हैं:

find /path/to/dir -type f > listOfFiles.list

यदि आप अन्य प्रकार की फाइलें चाहते हैं, तो आप टाइप पैरामीटर को उपयुक्त रूप से समायोजित कर सकते हैं।


7
अधिक भविष्य के सबूत समाधान को इंगित करने के लिए +1 ls। यह findउपनिर्देशिकाओं की पुनरावृत्ति करता है, गैर-पुनरावर्ती के लिए आपको तर्क -maxdepth 1से पहले जोड़ना होगा -type
kubanczyk

@AndyDalton कैसे एक सरणी में एक ही पाने के लिए
Kasun Siyambalapitiya

13

ध्यान दें कि:

ls -d "$PWD"/* > listOfFiles.list

यह वह शेल है जो निर्देशिका में (गैर-छिपी) फाइलों की सूची की गणना करता है और सूची को पास करता है lslsबस उस सूची को यहाँ प्रिंट करता है, ताकि आप भी कर सकें:

printf '%s\n' "$PWD"/*

3
printfयदि आप printfएक अलग प्रक्रिया के रूप में नहीं चलाया जाता है के रूप में हजारों फाइलें हैं का उपयोग कर जोड़ा बोनस है कि आप एक 'कमांड लाइन बहुत लंबी' त्रुटि नहीं है।
एड्रियन प्रैंक

2
@ AdrianPronk, हां, ऐसे गोले को छोड़कर, जहां printfबिल्ट-इन pdkshऔर उसके कुछ डेरिवेटिव्स या बॉरो शेल के अधिकांश संस्करण नहीं हैं। इसकी तुलना में एक दोष यह ls -dहै कि अगर वहां कोई गैर-छिपी हुई फ़ाइल नहीं है, तो यह प्रिंट होगा /path/to/*जबकि lsआपको उस फ़ाइल के बारे में एक त्रुटि देगा जो इसके बजाय मौजूदा नहीं है।
स्टीफन चेजलस

10

सिर्फ नियमित फ़ाइलों को देखने के लिए -

find "$PWD" -type f  > output

3

आप बस का उपयोग कर सकते हैं realpathया readlink:

ls | xargs realpath
  • xargs मानक इनपुट से कमांड लाइनों का निर्माण और निष्पादित करें।
  • realpath: canonicalized निरपेक्ष पथनाम वापस करें
  • readlink: एक प्रतीकात्मक लिंक का मूल्य पढ़ें

realpath: कमांड नहीं मिली
rogerdpack

@rogerdpack क्या आपके पास coreutils पैकेज स्थापित? मुझे वह जानकारी मिलती है dpkg -S /usr/bin/realpath। की जाँच करें इस
पाब्लो ए

3

इसके साथ एक अन्य तरीका tree, जिसका उल्लेख यहां नहीं किया गया है, यह पुनरावर्ती हो जाता है और खोजने या ls के विपरीत आपको कोई त्रुटि नहीं होती है (जैसे:) Permission denied, Not a directoryआप उस पूर्ण पथ को भी प्राप्त करते हैं जिस स्थिति में आप फ़ाइलों को xargsया अन्य कमांड को फीड करना चाहते हैं।

tree -fai /pathYouWantToList >listOfFiles.list

विकल्प अर्थ:

-a     All  files  are  printed.  By default tree does not print hidden files (those beginning with a dot
       `.').  In no event does tree print the file system constructs `.'  (current  directory)  and  `..'
       (previous directory).

-i     Makes tree not print the indentation lines, useful when used in conjunction with the -f option.

-f     Prints the full path prefix for each file.

स्थापित करने के लिए tree:

sudo apt install tree उबंटू / डेबियन पर

sudo yum install tree CentOS / फेडोरा पर

sudo zypper install tree OpenSUSE पर


1
पेड़: कमांड नहीं मिला
रोजरपैक

@rogerdpack sudo apt install treeUbuntu पर sudo yum install treeCentOS पर sudo zypper install treeOpenSUSE पर
एडवर्ड Florinescu

1
brew install treeमैक पर
oOEric

2

पिछले लिनक्स वातावरण में, मेरे पास एक resolveआदेश था जो पथों को मानकीकृत करेगा, जिसमें एक पथ को एक निरपेक्ष पथ बनाना शामिल है। मैं इसे अब नहीं ढूँढ सकता, इसलिए शायद यह उस संगठन के किसी व्यक्ति द्वारा लिखा गया था।

आप पायथन या पर्ल मानक पुस्तकालयों (और शायद अन्य भाषाओं में भी) के कार्यों का उपयोग करके अपनी स्क्रिप्ट बना सकते हैं।

resolve.py :

#!/bin/env python

import sys
import os.path

for path in sys.argv:
    print os.path.abspath(path)

resolve.pl :

#!/bin/env perl

use warnings;
use Cwd qw ( abs_path );

foreach (@ARGV) {
    print abs_path($_), "\n";
}

फिर, आप अपनी समस्या का समाधान करेंगे:

resolve.py * > listOfFiles.list

इस आदेश के साथ, आप इस तरह की चीजें भी कर सकते हैं:

cd /root/dir1/dir2/dir3
resolve.py ../../dir4/foo.txt
# prints /root/dir1/dir4/foo.txt
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.