ฉันมีโฟลเดอร์ที่มีไฟล์ประมาณ 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
อย่างไรก็ตามส่งคืน 10,000 ตามที่คาดไว้
ดูเหมือนว่าฉันจะเข้าใจผิดบางสิ่งพื้นฐานที่นี่ ...
ฉันใช้ zsh 5.0.2 บน Linux Mint 17.1, GNU tar 1.27.1
แก้ไข:
ฟอร์กแนะนำโดย @Archemar เสียงที่น่าเชื่อถือมากกับส้อมล่าสุดเขียนทับแฟ้มผล - ไฟล์ที่มี 'หาง' ของไฟล์ - 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:
ลักษณะ -T เช่นวิธีที่ดีที่ผมได้นอกจากนี้ยังพบตัวอย่างที่นี่
อย่างไรก็ตามเมื่อฉันลอง
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
เหตุใด tar จึงไม่เห็นชื่อไฟล์
ls