~ (बैकअप फ़ाइलों) के साथ समाप्त होने वाली फ़ाइलों की सूची से बचें


20

मेरी आवश्यकता एक निर्देशिका में सभी फ़ाइलों को सूचीबद्ध करने के लिए है, एक ~(बैकअप फ़ाइलों) के साथ समाप्त होने वाली फ़ाइलों को छोड़कर ।

मैंने कमांड का उपयोग करने की कोशिश की:

ls -l | grep -v ~    

मुझे यह आउटपुट मिलता है:

asdasad
asdasad~
file_names.txt
normaltest.txt
target_filename
testshell1.sh
testshell1.sh~
testshell2.sh
testshell2.sh~
testtwo.txt
testtwo.txt~
test.txt
test.txt~

मैं केवल इन फ़ाइलों को प्राप्त करना चाहता हूं:

asdasad
file_names.txt
normaltest.txt
target_filename
testshell1.sh
testshell2.sh
testtwo.txt
test.txt

ऐसा लगता है कि आप उन फ़ाइलों को सूचीबद्ध करने से बचने की कोशिश कर रहे हैं जो एक के साथ समाप्त होती हैं ~। ये फ़ाइल मेरे कुछ पाठ संपादकों द्वारा बनाई गई बैकअप फाइलें हैं।
बजे ctrl-alt-delor-

आप किस ऑपरेटिंग सिस्टम का उपयोग कर रहे हैं: क्या यह एक ग्नू / लिनक्स (जैसे डेबियन, उबंटू, रेडहैट, सेंटोस, फेडोरा, सुसे, मिंट, आर्क,…) है?
बजे ctrl-alt-delor-

2
ध्यान दें कि जिस फ़ाइल को आप अनदेखा करना चाहते हैं, वह Emacs बैकअप फ़ाइल है। एमएसीएस व्यवहार को बदलना आसान है, क्योंकि यह एक केंद्रीकृत निर्देशिका में बैकअप बचाता है और सभी जगह नहीं; देख emacs.stackexchange.com/questions/33/...
Kilian Foth

मुझे मतलबी होने का अफ़सोस है पर मुझे तुम पर विश्वास नहीं है; ls -l(अक्षर ell) में सूचीबद्ध प्रत्येक फ़ाइल के लिए अनुमतियाँ, nlinks, स्वामी, आकार और मोडटाइम शामिल होंगे। आपके द्वारा दिखाए जाने वाले आउटपुट का उत्पादन क्या होगा ls -1(अंक एक) और टर्मिनल-1 पर एकल-स्तंभ आउटपुट का उत्पादन करने के लिए कई प्रणालियों की आवश्यकता होती है , लेकिन जब पाइप किया जाता है (जैसा कि यहां ) या पुनर्निर्देशित किया जाता है, इसकी आवश्यकता नहीं है, यह पहले से ही एकल-स्तंभ है । lsgrep-1
dave_thompson_085

@ dave_thompson_085 मैंने सभी पाठ काट दिए हैं, और यहां केवल नाम दर्ज किए हैं .. क्योंकि मुझे लगा कि यह अप्रासंगिक है। और यह भी एक उत्पादन प्रणाली है (मेरी अपनी प्रणाली नहीं)। इसलिए मैं उपयोगकर्ता नाम, विवरण सूचीबद्ध करना और उन्हें लीक नहीं करना चाहता।
जिज्ञासु_ओन

जवाबों:


49
ls -l | grep -v ~

इसका कारण यह नहीं है कि टिल्ड आपके होम डायरेक्टरी में विस्तारित हो जाता है, इसलिए grepकभी भी एक शाब्दिक टिल्ड नहीं दिखता है। (उदाहरण के लिए टिल्ड विस्तार पर बैश का मैनुअल देखें ।) आपको विस्तार को रोकने के लिए इसे उद्धृत करने की आवश्यकता है, अर्थात

ls -l | grep -v "~"

बेशक, यह अभी भी कहीं भी एक टिल्डे के साथ किसी भी आउटपुट लाइनों को हटा देगा, यहां तक ​​कि lsआउटपुट में एक फ़ाइल नाम या कहीं और के बीच में (हालांकि यह संभवतः उपयोगकर्ता नाम, दिनांक या ऐसे में प्रकट होने की संभावना नहीं है)। यदि आप वास्तव में केवल फाइलों को अनदेखा करना चाहते हैं जो एक टिल्ड के साथ समाप्त होते हैं, तो आप उपयोग कर सकते हैं

ls -l | grep -v "~$"

48

GNU कार्यान्वयन ls(अधिकांश लिनक्स सिस्टम पर पाया जाता है) के लिए एक विकल्प है: -Bबैकअप पर ध्यान न दें:

ls --ignore-backups

24

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

shopt -s extglob

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

ls -d -- !(*~)
  • -d निर्देशिका की सामग्री को दिखाने के लिए नहीं
  • !(*~) के साथ समाप्त होने वाले को छोड़कर सभी फाइलें ~

Zsh पर, आप kshglobविकल्प के साथ या अपने स्वयं के विस्तारित ग्लब्स का उपयोग कर सकते हैं :

setopt extended_glob
ls -d -- ^*~

चूंकि प्रत्यय को बाहर करने के लिए केवल एक वर्ण लंबा होता है, इसलिए आप उन फिल्नामों का भी मिलान कर सकते हैं, जहां अंतिम चरित्र टिल्ड नहीं है (इसके बिना extglobभी काम करना चाहिए ):

ls -d -- *[^~]

लेकिन सामान्य विचार का उपयोग करना है ls --ignore-backups


12

यह मदद करनी चाहिए:

ls -l | grep -v '~'  

कारण: ~ चार को कमांड निष्पादित होने से पहले आपके होम डायरेक्टरी द्वारा बदल दिया जाता है। प्रयत्न

echo ~

तथा

echo '~'

6

जैसा कि अन्य उत्तरों में उल्लेख किया गया है कि आपको समस्या होने की संभावना है क्योंकि आपने टिल्ड को उद्धृत या बच नहीं किया है।

एक विशेष उपयोग के मामले के लिए मैंने कुछ समान करने के लिए शेल फ़ाइलनाम विस्तार का उपयोग किया है। मैं लगभग 2003 से इसका उपयोग कर रहा हूं, जिसका अर्थ है कि इसने विभिन्न प्रकार के सिस्टमों पर बहुत व्यापक रूप से शैल कार्यान्वयन पर काम किया है। (यहाँ मैं भी उपयोग करता -Cहूँ क्योंकि मैं छँटे हुए स्तंभों में एक अच्छा प्रदर्शन चाहता हूँ)

ls -C *[!~]

(शेल फ़ाइल नाम विस्तार का उपयोग करने के साथ एक सीमा निश्चित रूप से यह है कि बहुत बड़ी संख्या में (गैर-बैकअप) फ़ाइलों के साथ एक निर्देशिका उपलब्ध तर्क सूची आकार से अधिक होने का कारण बनेगी, हालांकि अधिकांश आधुनिक प्रणालियों पर यह सीमा काफी अधिक है, अक्सर 250KB या अधिक, कभी-कभी बहुत अधिक)


1

ls | grep -v '~$'त्वरित समाधान है। यह सभी (गैर-छिपी) फ़ाइलों को सूचीबद्ध करने के लिए ls का उपयोग करता है, फिर अंत में ( ) -v( ~) में टिल्डे ( ) के साथ सभी लाइनों को बाहर करने के लिए (उल्टे मिलान, यानी, बहिष्करण) के साथ grep का उपयोग करता है $

फिर भी, अगर आपके पास कोई फाइल है जैसे कि some1, some2, यह एक बड़ी बदबूदार संकेतक है, जिसका आपके पास एक खराब वर्कफ़्लो है, जिसे आपको स्रोत पर ठीक करना चाहिए, न कि कैसे एलएस काम करता है जैसे क्लूनी हैक के साथ।

यदि आप परीक्षण संस्करण और टेस्ट 2 या टेस्टोन और टेस्टव्यू जैसी संस्करण संख्याओं के साथ अपने आप को नामकरण फाइलें पाते हैं, तो आप वास्तव में जो चाहते हैं वह एक संस्करण नियंत्रण प्रणाली है, जैसे git

यह आपके मामले में विशेष रूप से सच है, जहां आपके पास कई फ़ाइलों के कई संस्करण हैं, और संस्करण को सभी फ़ाइलों के बीच समन्वित किए जाने की आवश्यकता है।

संस्करण नियंत्रण प्रणाली आपको फाइल सिस्टम पर एक समय विंडो को अनिवार्य रूप से ओवरले करने देती है, इसलिए आप केवल एक testफ़ाइल देखते हैं , लेकिन हुड के नीचे (संस्करण नियंत्रण कार्यक्रम के माध्यम से) सभी संस्करणों के माध्यम से खोज करने, पुनर्प्राप्त करने, वापस करने, साथ तुलना करने आदि के लिए उपलब्ध हैं। ।

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


1

हालांकि कई उत्तर सही हैं (मुझे @Foonविशेष रूप से एक पसंद है ), मैं ध्यान देता हूं कि नामों की सूची ls -lविभिन्न कारणों से थोड़ी लंगड़ी है।

फ़ाइलों को खोजने के लिए उचित उपकरण, आश्चर्यजनक रूप से, है find

इसका एक उत्थान यह है कि यह "चयन तर्क" को खुद से संभालने में सक्षम है, उदाहरण के लिए:

$ find . -maxdepth 1 \( -type f -a \! -name '*~' \) -print

जो सचमुच में कहता findहै:

  1. वर्तमान निर्देशिका में फ़ाइलें देखें: .
  2. केवल उन्हें उस निर्देशिका के स्तर पर देखें - यानी पुनरावृत्ति न करें: -maxdepth 1
  3. वहां, संस्थाओं की तलाश करें, जो

    • प्रकार की फ़ाइल: -type f
    • तथा: -a
    • जिनके नाम समाप्त नहीं होते हैं ~: ! -name *~ ( !फ़ाइल नामों पर मेल खाने वाले निम्नलिखित निर्देशों को नकारता है -name *~)।

    (पूरे मैच को टाइप और नाम को तार्किक इकाई के रूप में प्रदर्शित करने के लिए, इसे संक्षिप्त किया गया है ) (और )

  4. प्रत्येक फ़ाइल का नाम प्रिंट करें -print:।

आपको कुछ वर्णों की रक्षा करने की आवश्यकता है जो शेल द्वारा व्याख्या किए जाने से शेल के लिए विशेष हैं, और यही कारण है कि कोष्ठक और बैंग, !बैकस्लैश-बच गए हैं, और नाम पैटर्न, *~एकल उद्धरण से घिरा हुआ है।

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

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