मेरे पास लगभग 20K फ़ाइलों वाला एक फ़ोल्डर है। फाइलों का नाम पैटर्न के अनुसार रखा गया है xy_{\d1,5}_{\d4}\.abc
, जैसे xy_12345_1234.abc
। मैं इस कमांड का उपयोग करके उनमें से पहले 10K को संक्षिप्त करना चाहता था:
ls | sort -n -k1.4,1.9 | head -n10000 | xargs tar -czf xy_0_10000.tar.gz
हालाँकि परिणामी फ़ाइल में केवल 2K फ़ाइलों के बारे में था।
ls | sort -n -k1.4,1.9 | head -n10000 | wc -l
हालाँकि, उम्मीद के मुताबिक़ 10000 मिलते हैं।
ऐसा लगता है कि मैं यहाँ कुछ बुनियादी गलत समझ रहा हूँ ...
मैं लिनक्स मिंट 17.1, जीएनयू टार 1.27.1 पर zsh 5.0.2 का उपयोग कर रहा हूं
संपादित करें:
@Archemar द्वारा सुझाए गए के रूप में forking बहुत प्रशंसनीय लगता है, जिसके परिणामस्वरूप नवीनतम कांटा ओवररेटेड फ़ाइल - फ़ाइल में फ़ाइलों की 'पूंछ' - 7773 से 9999 तक होती है ।
का परिणाम xargs --show-limit
:
Your environment variables take up 3973 bytes
POSIX upper limit on argument length (this system): 2091131
POSIX smallest allowable upper limit on argument length (all systems): 4096
Maximum length of command we could actually use: 2087158
Size of command buffer we are actually using: 131072
जगह -c
के साथ -r
या -u
मेरे मामले में काम नहीं किया। त्रुटि संदेश थाtar: Cannot update compressed archives
दोनों का उपयोग कर -r
और -u
अमान्य है और साथ में विफल रहता हैtar: You may not specify more than one '-Acdtrux', '--delete' or '--test-label' option
के -c
साथ की जगह के -a
रूप में अच्छी तरह से अमान्य लगता है और उसी के साथ विफल रहता है, tar: You must specify one of the '-Acdtrux', '--delete' or '--test-label' options
हालांकि मैं इस मुद्दे को नहीं पहचानता azf
और Acdtrux
मेरे लिए अप्रिय लगता हूं।
संपादित करें 2:
-एक अच्छा तरीका लगता है, मुझे यहां एक उदाहरण भी मिला है ।
हालाँकि जब मैं कोशिश करता हूँ
ls | sort -n -k1.4,1.9 | head -n10000 | tar -czf xy_0_10000.tar.gz -T -
मुझे मिला
tar: option requires an argument -- 'T'
ठीक है, शायद फ़ाइल नाम टार तक नहीं पहुँचते? लेकिन ऐसा लगता है कि वे करते हैं, क्योंकि जब मैं निष्पादित करता हूं
ls | sort -n -k1.4,1.9 | head -n10000 | tar --null -czf xy_0_10000.tar.gz -T -
मुझे मिला
tar: xy_0_.ab\nxy_1_...<the rest of filenames separated by literal \n>...998.ab
Cannot stat: File name too long
तो क्यों फिल्नामों को नहीं देख रहा है?
ls
find
, जिसमें -print0
एक न्यूलाइन के बजाय एक नल बाइट को सीमांकक के रूप में उपयोग करने का विकल्प है। ध्वज के sort
साथ संभाल सकता है -z
। head
, दुर्भाग्य से अशक्त बाइट सीमांकक को समझने संभाल नहीं है, लेकिन क्या यह उत्तर एक समाधान का उपयोग है tr
स्वैप करने के लिए \n
और \0
पहले और बाद में head
। tar
है --null -T -
से अशक्त सीमांकित फ़ाइल नाम पढ़ने के लिए stdin
।