'Dir' और 'ls' टर्मिनल कमांड के बीच अंतर?


74

मैं टर्मिनल में dirऔर lsकमांड का उपयोग करने के बीच अंतर खोजने की कोशिश कर रहा हूं । मुझे पता है कि ls एक निर्देशिका में फाइलों को देखने की पारंपरिक UNIX विधि है, और यह dirविंडोज़ कमांड प्रॉम्प्ट समतुल्य है, लेकिन दोनों कमांड टर्मिनल में काम करते हैं।

यदि मैं टाइप dirकरता हूं तो यह डायरेक्टरी में फाइलों और फ़ोल्डरों को प्रदर्शित करता है, और यदि मैं टाइप lsकरता हूं तो यह कंटेंट हाइलाइटिंग को छोड़कर ऐसा ही करता है। दोनों आदेशों को स्वीकार विकल्प (यानी ls -aऔर dir -aदोनों सभी फ़ाइलों और फ़ोल्डरों और छिपे हुए फ़ाइलों को लौटा।

तो क्या किसी को पता है कि क्या अंतर है और क्यों dirऔर दोनों lsका उपयोग किया जाता है?


7
dir --color;)
रिंज़विंड

3
सिर्फ यह कहना चाहता था कि इस प्रश्न को मिली प्रतिक्रिया की मात्रा से मैं हैरान हूं। मुझे लगता है कि मैं इस बारे में सोचकर अकेला नहीं था :)
ब्रेट

3
प्राचीन काल के कमांड हमेशा पुराने नर्ड को लकड़ी से बाहर खींचते हैं;)
रिनविंड

जवाबों:


70

dirऔर lsका हिस्सा हैं coreutilsऔर dirके रूप में लगभग एक ही है ls, बस अलग-अलग डिफ़ॉल्ट विकल्पों के साथ।

जीएनयू कोर यूटिलिटीज जीएनयू ऑपरेटिंग सिस्टम की मूल फाइल, शेल और टेक्स्ट मैनिपुलेशन यूटिलिटीज हैं। ये मुख्य उपयोगिताओं हैं जो हर ऑपरेटिंग सिस्टम पर मौजूद होने की उम्मीद है।

info dir कहते हैं:

dirके बराबर है ls -C -b; डिफ़ॉल्ट रूप से, फ़ाइलों को स्तंभों में सूचीबद्ध किया जाता है, लंबवत क्रमबद्ध किया जाता है, और विशेष वर्ण बैकस्लैश एस्केप अनुक्रम द्वारा दर्शाए जाते हैं।

ओह और भी है vdir! info vdirकहते हैं:

vdirके बराबर है ls -l -b; अर्थात्, डिफ़ॉल्ट फ़ाइलों को लंबे प्रारूप में सूचीबद्ध किया जाता है और विशेष वर्ण बैकस्लैश एस्केप अनुक्रम द्वारा दर्शाए जाते हैं।

अधिकांश संभावना dirपीछे की संगतता या ऐतिहासिक कारणों के कारण मौजूद है।


मैं सोच रहा था कि यह शायद दूसरे का एक उर्फ ​​था। मैंने माना कि तर्क घरेलू उपयोग करने वालों को घर पर अधिक महसूस कराने के लिए था, पूरी तरह से उत्तर देने के लिए धन्यवाद!
ब्रेट

4
टाइप alias dirदेखने के लिए क्या यह वास्तव में है। aliasसभी उपनामों को देखने के लिए टाइप करें।
user606723

2
@ user606723, 'alias dir' 11.10 में नहीं दिखता (कम से कम मेरे लिए नहीं)। मेरा मानना ​​है कि 'उपनाम' केवल स्थानीय उपयोगकर्ता उपनाम सेटिंग्स दिखाता है, सिस्टम वाइड नहीं।
जेम्स

टाइप type dirकरने के लिए देखें कि यह क्या है (एक उपनाम, एक कमांड, बैश फ़ंक्शन ...)
ychaouche

49

के बीच संबंध lsऔरdir

lsऔर dirअलग-अलग प्रोग्राम हैं जो समान व्यवहार करते हैं। जैसा कि नीचे समझाया और संदर्भित किया गया है, का उद्देश्य dirएक कमांड प्रदान करना है, lsजिसका आउटपुट किसी टर्मिनल पर जा रहा है या नहीं, इसके आधार पर भिन्न नहीं होता है । इस मदद को प्राप्त करने के लिए, dirअपने आउटपुट को इस तरह से प्रारूपित करना चाहिए जो किसी टर्मिनल में देखने और फ़ाइल या पाइप पर लिखने के लिए उचित और उपयोगी हो।

इसके बारे में दो आम गलतफहमियाँ हैं dir:

  • कई लोगों का मानना dirहै कि यह एक उपनाम है ls, लेकिन ऐसा नहीं है। न तो कमांड दूसरे का एक उपनाम है, और उबंटू में डिफ़ॉल्ट रूप से, dirएक उपनाम नहीं है। lsऔर dirअलग-अलग, गैर-समान निष्पादन योग्य द्वारा प्रदान किए जाते हैं।
  • कई लोगों का मानना dirहै कि अस्पष्ट ऐतिहासिक कारणों से या कुछ मानक या कुछ अन्य ओएस के साथ संगतता प्रदान करने के लिए मौजूद है। ऐसी बात नहीं है। lsयह कॉम्पैटिबिलिटी के लिए जिस तरह से व्यवहार करता है। dir, जो संगत नहीं है क्योंकि यह एक मानक यूनिक्स कमांड नहीं है, एक वैकल्पिक तरीके से व्यवहार करता है जिसे डेवलपर्स अपने आप में मूल्यवान मानते हैं और संभवतः बेहतर भी।

ठीक है, लेकिन वास्तव में कैसे lsऔर dirअलग है?

दोनों lsऔर dirनिर्देशिकाओं की सामग्री को सूचीबद्ध करते हैं। उनके डिफ़ॉल्ट व्यवहार में दो विशिष्ट अंतर उन्हें अलग करते हैं।

  1. जब इसका मानक आउटपुट एक टर्मिनल होता है, तो lsफ़ाइल नाम को लंबवत क्रमबद्ध कॉलम (जैसे ls -C) में सूचीबद्ध करता है । जब इसका मानक आउटपुट टर्मिनल नहीं होता है (उदाहरण के लिए, एक फ़ाइल या पाइप ), तो lsप्रति लाइन एक फाइलनाम को सूचीबद्ध करता है (जैसे ls -1)।

    इसका मानक आउटपुट टर्मिनल है या नहीं, dirफ़ाइल नाम को क्रमबद्ध स्तंभों (जैसे ls -C) में सूचीबद्ध करता है ।

    दोनों के लिए lsऔर dir, इन चूक द्वारा ओवरराइड किया जा सकता --format=झंडा और से -1, -C, -m, और -xझंडे, जो विशेष रूप से संक्षिप्त --format=विकल्प। देखें 10.1.4 जनरल उत्पादन स्वरूपण में GNU coreutils संदर्भ मैनुअल जानकारी के लिए।

  2. जब इसका मानक आउटपुट एक टर्मिनल होता है और सूचीबद्ध होने के लिए एक फ़ाइलनाम में नियंत्रण वर्ण होते हैं , प्रत्येक नियंत्रण वर्ण (जैसे ) के बजाय lsप्रिंट होता है । जब इसका मानक आउटपुट टर्मिनल नहीं होता है, तो वर्णों को नियंत्रित करता है जैसा कि (जैसे ) है।?ls -qlsls --show-control-chars

    मानक मानक एक टर्मिनल है या नहीं, जब dirएक नियंत्रण चरित्र या किसी भी अन्य चरित्र का सामना करना पड़ता है , जिसे विशेष रूप से व्याख्या किया जाएगा यदि एक खोल में दर्ज किया जाता है, तो यह पात्रों के लिए बैकलैश दृश्यों को प्रिंट करता है। इसमें रिक्त स्थान जैसे अपेक्षाकृत सामान्य वर्ण भी शामिल हैं। उदाहरण के लिए, dirएक प्रविष्टि सूचीबद्ध करेगा जिसे कहा Documents backupsजाता है Documents\ backups। यह जैसा है ls -b

    दोनों के लिए lsऔर dir, इन चूकों को 10.1.7 में सूचीबद्ध झंडे द्वारा ओवरराइड किया जा सकता है और फ़ाइल नामों को जीएनयू कोरुटिल्स संदर्भ मैनुअल में प्रारूपित किया जा सकता है । इसमें शामिल हैं -b, -q, --quoting-style=, और कुछ अन्य।

स्रोत : ls मंगलाचरण और dir मंगलाचरण , GNU Coreutils संदर्भ मैनुअल में

क्यों है dir?

एक अलग dirउपयोगिता के लिए तर्क 4.5 मानकों में अंतर के लिए दिया जाता है आम तौर पर जीएनयू कोडिंग मानकों का । मैं डेवलपर्स के तर्क को समझने के लिए उस पूरे खंड को पढ़ने की सलाह देता हूं, लेकिन यहां इस पर प्रकाश डाला गया है : ls/dir

कृपया इसे लागू करने के लिए उपयोग किए जाने वाले नाम पर निर्भर करते हुए उपयोगिता का व्यवहार न करें ...।

इसके बजाय, वैकल्पिक व्यवहार के बीच चयन करने के लिए रन टाइम विकल्प या संकलन स्विच या दोनों का उपयोग करें ...।

इसी तरह, कृपया कमांड-लाइन प्रोग्राम का व्यवहार आउटपुट डिवाइस के प्रकार पर निर्भर न करें …।

संगतता को आउटपुट डिवाइस के प्रकार पर निर्भर करने के लिए कुछ कार्यक्रमों की आवश्यकता होती है। यदि सभी उपयोगकर्ता अपेक्षा करते हैं तो ऐसा करना विनाशकारी होगा lsया shनहीं। इनमें से कुछ मामलों में, हम प्रोग्राम को एक पसंदीदा वैकल्पिक संस्करण के साथ पूरक करते हैं जो आउटपुट डिवाइस प्रकार पर निर्भर नहीं करता है। उदाहरण के लिए, हम एक dirकार्यक्रम प्रदान करते हैं , lsसिवाय इसके कि इसका डिफ़ॉल्ट आउटपुट स्वरूप हमेशा बहु-स्तंभ प्रारूप होता है।

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

जबकि lsडिवाइस को स्वतंत्र रूप से व्यवहार करने के लिए यथोचित नहीं लिखा जा सकता था, dirइसे प्राप्त करने के लिए एक अलग उपयोगिता बनाई गई थी। इस प्रकार dirउपयोगिता नहीं है जो ऐतिहासिक संगतता के कारणों के लिए अजीब व्यवहार करती lsहै - है

कैसे को देखने के लिए ls, dirऔर संबंधित vdirउपयोगिता अनावश्यक कोड दोहराव बिना coreutils स्रोत कोड में लागू किया जाता है, को देखने के ls-dir.c, ls-ls.c, ls-vdir.c, ls.h, और ls.c

है dirवास्तव में उपयोगी?

यदि आपने कभी भी lsमल्टी-कॉलम आउटपुट का उत्पादन किया है, तब भी जब आप इसे less( ls | less) या फ़ाइल ( ls > out.txt) में रीडायरेक्ट करते हैं , तो आप इसका उपयोग कर सकते हैं dirया कर सकते हैं ls -C

यदि आप कभी भी चाहते हैं कि आप सीधे दिखाए गए फ़ाइल नाम की प्रतिलिपि बनाls सकते हैं और इसे कमांड के भाग के रूप में उपयोग कर सकते हैं, तो आप उद्धृतdir या उपयोग किए बिना चिंता कर सकते हैं ls -b

dirके समतुल्य है ls -Cb, इसलिए इस अर्थ में आपको आवश्यकता नहीं है dir। लेकिन dirविकल्पों का एक संयोजन प्रदान करता है जो व्यवहार में अक्सर उपयोगी होता है (हालांकि व्यापक रूप से ज्ञात नहीं है)।

मुझे ls(यहां तक ​​कि ls -Cb) से रंगीन उत्पादन क्यों मिलता है dir?

अधिकांश उबंटू उपयोगकर्ताओं के पास एक उपनाम है lsजो चलता है ls --color=auto। जब lsउपनाम और बाहरी आदेश दोनों मौजूद होते हैं, तो उपनाम सरल, संवादात्मक आदेशों में पूर्वता लेता है।

उपनाम की परिभाषाओं का पुनरावर्ती रूप से विस्तार नहीं किया गया है - यह बाहरी lsआदेश है जो lsउपनाम के साथ बुला रहा है --color=autoअलियास कैसे काम करते हैं, इसके बारे में अधिक जानकारी के लिए बैश संदर्भ मैनुअल में 6.6 उपनाम देखें ।

जब पास किया जाता है ls, dirया vdir(और कुछ अन्य कमांड, जैसे grep), --color=autoरंग का उपयोग करता है जब इसका आउटपुट एक टर्मिनल होता है, लेकिन अन्यथा नहीं।

उबंटू में डिफ़ॉल्ट रूप से, उपयोगकर्ता खाते इसके साथ बनाए जाते हैं ~/.bashrc:

# enable color support of ls and also add handy aliases
if [ -x /usr/bin/dircolors ]; then
    test -r ~/.dircolors && eval "$(dircolors -b ~/.dircolors)" || eval "$(dircolors -b)"
    alias ls='ls --color=auto'
    #alias dir='dir --color=auto'
    #alias vdir='vdir --color=auto'

    alias grep='grep --color=auto'
    alias fgrep='fgrep --color=auto'
    alias egrep='egrep --color=auto'
fi

आप देखेंगे कि lsअन्य नाम ( alias ls='ls --color=auto') थोड़ी देर के लिए उन, uncommented है dirऔर vdirबाहर टिप्पणी की है के साथ #तो वे कोई प्रभाव नहीं ले। यही कारण है, जबकि dirएक अन्य नाम नहीं है, lsहै (लेकिन नहीं dir)

मैं dirरंगीन उत्पादन कैसे करूं ?

रंगीन आउटपुट को सक्षम करने के लिए dir, बस .bashrcअपने होम डायरेक्टरी में एडिट करें और #alias dir='dir --color=auto'लीड को हटाकर लाइन को अनकम्प्लीट करें #। परिवर्तन के बाद शुरू किए गए गोले में, dirएक उपनाम होगा।

यदि आप वर्तमान शेल में परिवर्तन चाहते हैं, तो आप उपनाम के रूप में एक कमांड .bashrcचला सकते हैं, या आप चलाकर स्रोत बना सकते हैं . ~/.bashrc

यह यकीनन के मुख्य बिंदु के खिलाफ जाता है dir- यह आउटपुट डिवाइस की परवाह किए बिना एक ही प्रकार के आउटपुट का उत्पादन करना चाहिए। हालाँकि:

  • यदि आपको यह dirउपनाम बनाने के लिए उपयोगी लगता है , तो आपको निश्चित रूप से ऐसा करना चाहिए।
  • जब एक बाहरी कमांड के रूप में कहा जाता है, उदाहरण के लिए स्क्रिप्ट में या यदि आप उर्फ ​​को चालू करके \dirया command dir, dirअभी भी डिवाइस-स्वतंत्र आउटपुट का उत्पादन करेंगे। यह है कि अलियासिंग कहने के लिए है dirकरने के लिए dir --color=autoवास्तव में नष्ट नहीं होती है dir

गुणवत्ता उत्तर, लेकिन एक ToC या TL का उपयोग कर सकते हैं; DR; :)
केविन

5

मुझे लगता है कि dirवहाँ सिर्फ पश्चगामी संगतता के लिए इच्छुक होगा ।

से GNU coreutils :

dir ls -C -b के बराबर है; डिफ़ॉल्ट रूप से, फ़ाइलों को स्तंभों में सूचीबद्ध किया जाता है, लंबवत क्रमबद्ध किया जाता है, और विशेष वर्ण बैकस्लैश एस्केप अनुक्रम द्वारा दर्शाए जाते हैं।

वैसे, lsडिफ़ॉल्ट रूप से उत्पादन colorize नहीं करता है: यह है क्योंकि ज्यादातर distros उर्फ है lsकरने के लिए ls --color=autoमें /etc/profile.d। परीक्षण के लिए, unalias lsफिर टाइप करें ls: यह रंगहीन होगा।

स्रोत: Renan के जवाब के लिए क्या "dir" और "ls" के बीच का अंतर है ?


हालांकि dirहै नहीं पश्च संगतता के लिए प्रदान की --और lsवास्तव में है --This जवाब (और जवाब यह से उद्धरण) सही ढंग से दो आदेशों के बीच तकनीकी अंतर राज्य है सामान्यतः मनाया colorization अंतर बताने के लिए अच्छी तरह से। तो +1।
एलियाह कगन

3

संदेह होने पर, की तुलना type lsबनाम type dir(यह भी देखें ls और ला के बीच अंतर ):

$ type dir
dir is aliased to `ls -l'

$ type ls
ls is aliased to `_ls'

$ type _ls
_ls is a function
_ls ()
{
    local IFS=' ';
    command ls $LS_OPTIONS ${1+"$@"}
}
$ echo command ls $LS_OPTIONS ${1+"$@"}
command ls -N --color=tty -T 0

अंतर अलग-अलग विकल्पों के लिए उबलता है ls, मेरे मामले --color=ttyमें सबसे अधिक दिखाई देगा, आपका सिस्टम भिन्न हो सकता है।


2
यह एक डिफ़ॉल्ट Ubuntu उपयोगकर्ता विन्यास की तरह बिल्कुल नहीं लगता है। मुझे नहीं लगता कि मेरे द्वारा उपयोग किए गए उबंटू सिस्टम में से किसी ने lsएक फ़ंक्शन के लिए एक उपनाम के रूप में लिया है _ls- यहां तक ​​कि एक टिप्पणी-आउट लाइन के रूप में भी नहीं .bashrc। यह ओपनसेउ के लिए (कम से कम कुछ संस्करणों के) डिफॉल्ट की तरह प्रतीत होता है, हालांकि, इस बातचीत को देखते हुए , यह फाइल (वहां से जुड़ा हुआ), और मेरी (संभवतः शायद गलत) स्मृति जब मैंने आखिरी बार ओपनएसयूएसई का उपयोग किया था।
एलियाह कगन

2
@EliahKagan: आपने अनुमान लगाया, मैं OpenSuse का उपयोग कर रहा हूँ! इसलिए जैसा कि मैंने कहा, परिणाम अलग-अलग होगा, लेकिन विधि ठीक होनी चाहिए।
user2394284

2

संक्षिप्त उत्तर: कोई नहीं, dirसमान स्रोत कोड है ls, lsबाइनरी --colorडिफ़ॉल्ट रूप से है। (कोड की एक पंक्ति अलग है)


7
dirका उपनाम नहीं है ls। वे अलग /usr/binतरीके से व्यवहार करते हैं, जैसा कि रिन्जविंड के उत्तर में वर्णित है । आप इसे उपनाम के साथ प्राप्त कर सकते हैं, लेकिन यह नहीं है कि यह कैसे हासिल किया जाता है। GNU Coreutils का उपयोग करने वाली सभी प्रणालियों पर अलग dirऔर lsबायनेरी दिखाई देते हैं । यदि आपको प्रमाण की आवश्यकता है, तो दौड़ें । cmp /bin/ls /bin/dir
एलियाह कगन

2
कुछ समय पहले यह एक उपनाम था और आप इसे केवल लिखकर उपनाम सूची में सूचीबद्ध देख सकते थे alias, अब एक नया बाइनरी डायर के लिए संकलित किया गया है। आप के साथ अपने कोड डाउनलोड कर सकते हैं: git clone git://git.sv.gnu.org/coreutils। कोड की केवल एक पंक्ति ls-dir.c में बदल जाती है और यह है int ls_mode = LS_MULTI_COL;:। तकनीकी रूप से एक उपनाम नहीं है, लेकिन व्यावहारिक रूप से यह एलएस है लेकिन विभिन्न डिफ़ॉल्ट विकल्पों (कोड की 1 पंक्ति) के साथ है।
फ्रांसिस्को वाल्डेज़

1
हाँ, dirहै lsअलग-अलग डिफ़ॉल्ट विकल्पों के साथ लेकिनdirऔर lsवितरण में हमेशा अलग बायनेरी रहे हैं जो GNU Coreutils का उपयोग करते हैं। कुछ वितरण, या हो सकता है, को भी एक उपनाम कहा जाता है dir(उपनामों को परिभाषित करना जो एक मौजूदा कमांड के रूप में एक ही नाम है, सामान्य है)। लेकिन वे अलग-अलग निष्पादन योग्य हैं। शेल उर्फ ​​(जो एक फ़ाइल बिल्कुल नहीं है) और समान स्रोत कोड के साथ एक अलग निष्पादन योग्य के बीच अंतर करने के लिए, पांडित्य भेद नहीं है। यह कहना गलत और भ्रामक है कि उबंटू में dirएक अन्य व्यक्ति है ls
एलिया कगन

हां, मैं आपसे सहमत हूं, लेकिन इस मामले में, समान स्रोत कोड नहीं है, समान स्रोत कोड है। यदि हम कहते हैं कि एक उपनाम केवल कुछ भी है aliasतो निश्चित रूप से एक उपनाम नहीं है।
फ्रांसिस्को वाल्डेज़

3
यह समान स्रोत कोड नहीं है। जैसा कि आपने कहा, "स्रोत की एक पंक्ति को बदल दिया गया है।" और अगर यह एक ही स्रोत थे तो यह अभी भी एक उपनाम नहीं होगा। यूनिक्स जैसी प्रणाली में बहुत सारी चीजें हैं जो एलियासेस के समान हैं लेकिन जो बहुत ही आश्चर्यजनक रूप से नौसिखियों को भ्रमित करेंगे (और अनुभवी उपयोगकर्ताओं के लिए अत्यधिक) को उपनाम कहते हैं। प्रतीकात्मक लिंक, हार्ड लिंक, समान फाइलें, समान फाइलें, आवरण स्क्रिप्ट, निष्पादन को छिपाने वाली शेल बिल्डिंग्स, और सिंक की गई फ़ाइलें (जैसे UbuntuOne) सभी महत्वपूर्ण तरीकों से उपनाम के समान हैं, लेकिन वे उपनाम नहीं हैं।
एलियाह कगन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.