У мене папка з приблизно 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, як і очікувалося.
Мені здається, я тут розумію щось базове ...
Я використовую 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
здається, суперечить мені.
EDIT 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
То чому тар не бачить назви файлів?
ls
find
, який має -print0
можливість використовувати нульовий байт як роздільник замість нового рядка. sort
може впоратися з цим -z
прапором. head
, на жаль, не вдається зрозуміти нульові байтові обмежувачі, але ця відповідь має рішення за допомогою tr
swap \n
і \0
до, і після head
. tar
має --null -T -
читати імена файлів з нульовим обмеженням stdin
.