बैश में आम उपसर्ग के साथ फ़ाइलों को कैसे विभाजित करें


2

मैं आम उपसर्ग, जैसे के साथ कई फाइलों के साथ एक निर्देशिका है gsc*_other.foo, जहां * एक चरित्र है कि से चला जाता है 0के लिए 9या a/ b(जहां aके लिए खड़ा है 10और bके लिए 11)। मेरा लक्ष्य gsc*हर एक के साथ एक ही तरह से टेक्स्ट फाइल बनाना है (यानी, पहली टेक्स्ट फाइल में सभी gsc0_other.foo, दूसरा सब है gsc1_other.foo, और इसी तरह)। मुझे सिर्फ इतना पता है कि मुझे किसी चीज़ की ज़रूरत है split, लेकिन फाइलों की एक पंक्ति या आकार के बजाय, एक सामान्य उपसर्ग पर विभाजित करना। मैंने पहले से ही एक समान स्क्रिप्ट बनाई है, फाइलों को अधिकतम संख्या में सूचीबद्ध करने के लिए:

find ./J0902-405/*.evt -maxdepth 1 -type f -printf '%f\n' | 
  split -l498 -d - files_xselect.list

और मैं कई अन्य तरह से मैं क्या जरूरत है इस स्क्रिप्ट को बदलने के लिए के लिए देखा (जैसे अधिक split, xargs, sed), लेकिन यह के साथ जाने के लिए एक रास्ता नहीं है।

जवाबों:


3

इसे प्राप्त करने के कई तरीके हैं, मैं बस उन विभिन्न मूल्यों पर लूप करूंगा जिन्हें आप विभाजित करना चाहते हैं, अर्थात

for i in {0..9} a b; do
    ls -1 gsc"${i}"* > filelist"${i}".txt
done

यह प्रभावी रूप से चलेगा

ls -1 gsc0* > filelist0.txt
ls -1 gsc1* > filelist1.txt
ls -1 gsc2* > filelist2.txt
...

ध्यान दें कि यदि कोई फ़ाइल मौजूद नहीं है, तो त्रुटि संदेश को स्ट्राइडर पर मुद्रित किया जाएगा, अर्थात टर्मिनल पर, फिल्मकार को पुनर्निर्देशित नहीं किया जाएगा, फाइललिस्ट बनाया जाएगा लेकिन खाली रहेगा।


मैं सिर्फ इस बात पर जोर देना चाहता था कि मुझे अभी भी findउचित निर्देशिका को ट्रैक करने की आवश्यकता है। लेकिन फिर भी एक महान जवाब! धन्यवाद।
Py-ser

1

यह मानते हुए कि आपकी सभी फाइलें पैटर्न की हैं gsc*_*, मेरा मतलब है कि कहां gscऔर क्या _है जो आप इंडेक्स के रूप में उपयोग करना चाहते हैं, यह काम करना चाहिए:

find ./J0902-405/*.evt -maxdepth 1 -type f -printf '%f\n' | 
   awk -F'_' '{print $0 > $1"_list.txt"}'

कि gsc0_list.txt, gsc1_list.txtआदि नामक फ़ाइलों का निर्माण करेगा ।

चाल दे रहा है awk(एक अंडरस्कोर _) अपने क्षेत्र विभाजक के रूप में ( -F'_') इतना है कि पहले क्षेत्र ( $1) हो जाएगा gsc0, या gsc1या gsc11आदि उसके बाद, आप संलग्न ( print >>) वर्तमान पंक्ति (फ़ाइल नाम) नामक एक फाइल करने के लिए "whatever value $1 has"_list.txt


एक परीक्षा:

$ tree
├── foo
   └── bar
       ├── gsc0_12630.foo
       ├── gsc10_14894.foo
       ├── gsc11_23911.foo
       ├── gsc1_18215.foo
       ├── gsc2_14017.foo
       ├── gsc3_22263.foo
       ├── gsc4_16461.foo
       ├── gsc5_29327.foo
       ├── gsc6_14337.foo
       ├── gsc7_27295.foo
       ├── gsc8_7591.foo
       └── gsc9_31840.foo
├── gsc0_26853.foo
├── gsc10_30741.foo
├── gsc11_27136.foo
├── gsc1_25097.foo
├── gsc2_1446.foo
├── gsc3_7110.foo
├── gsc4_7399.foo
├── gsc5_14557.foo
├── gsc6_21869.foo
├── gsc7_13413.foo
├── gsc8_2952.foo
└── gsc9_20981.foo

$ find . -type f -printf '%f\n' | awk -F'_' '{print $0 > $1"_list.txt"}'
$ ls *txt
gsc0_list.txt   gsc11_list.txt  gsc2_list.txt  gsc4_list.txt  
gsc6_list.txt   gsc8_list.txt   gsc10_list.txt gsc1_list.txt   
gsc3_list.txt  gsc5_list.txt  gsc7_list.txt  gsc9_list.txt
$ cat gsc6_list.txt
gsc6_21869.foo
gsc6_14337.foo

ध्यान दें कि यह आपको फ़ाइल का मार्ग नहीं देता है और आपके पास आसानी से डुप्लिकेट नाम हो सकते हैं, लेकिन आप स्पष्ट रूप से अपने find -printfआदेश के साथ पथ को हटा रहे हैं, इसलिए मुझे लगता है कि आप क्या करना चाहते हैं।

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