У меня есть папка с около 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кажется мне несвязной.
РЕДАКТИРОВАТЬ 2:
-Т выглядит неплохо, я также нашел пример здесь .
Однако, когда я пытаюсь
ls | sort -n -k1.4,1.9 | head -n10000 | tar -czf xy_0_10000.tar.gz -T - я получил
tar: option requires an argument -- 'T'
ну, возможно, имена файлов не доходят до tar? Но похоже, что они делают, потому что, когда я выполняю
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
find, у которого есть -print0возможность использовать нулевой байт в качестве разделителя вместо новой строки. sortможет справиться с этим с -zфлагом. headК сожалению, не обрабатывает понимать нулевые байтовые разделители, но этот ответ имеет решение использовать trдля замены \nи \0до и после head. tarдолжен --null -T -читать имена файлов с нулевым разделителем stdin.