Не мог связать файлы с находкой./subdir /*-print0 | вид | xargs-0 кошек> merge.txt

Мой ответ ниже должен быть неправильным, я перепутал дату: новый второй прыжок был вставлен 30 июня 2012 в 23:59:60 UTC. Не 18-го июня.


Прыжок, второй, который был представлен в тот день.

Секунды прыжка не так предсказуемы как високосные годы, они обычно вызываются из-за больших наземных землетрясений, цунами... такая вещь. Где високосный год довольно предсказуем (о каждых четырех годах), второй прыжок не. Существует комиссия ярких мозгов людей (я верю в ООН), которые решают, там должен быть представлен второй прыжок. Это может только быть предсказано приблизительно 60 дней заранее. Многим системам не нравится, когда время проходит от...:59 до...:60 прежде, чем идти в...:00. Базам данных не нравится время, задержанное секунда, они действительно требовательны в отношении меток времени, происходящих только однажды.

https://en.wikipedia.org/wiki/Leap_second#Announcement_of_leap_seconds

2
28.05.2013, 20:21
2 ответа

Не уверенный, почему Вы получаете ту ошибку.

find ./subdir/* -print0

(принятие --print0 если бы опечатка был), то произвел бы большую ненагруженную линию с несколькими символами NUL в нем. Поскольку это не заканчивается в символе новой строки и потому что это содержит символы NUL, это не текст, таким образом, поведение текстовых утилит как sort является неуказанным там. Вид GNU, рассматривал бы его как одну большую строку и добавил бы назад недостающую новую строку.

Возможно, Вы используете busybox sort который насколько я могу сказать обработкам те символы NUL на входе как разделители строки также, но выходные строки, завершенные символами новой строки.

xargs -0 ожидает, что NUL разделил записи. Таким образом с видом GNU, xargs рассматривал бы sort вывод как тот же список, как сгенерировано find -print0 плюс на побочном элементе, состоящем который дополнительный символ новой строки, добавленный sort.

В случае busybox sort, потому что все NULs были преобразованы в новые строки, до существует только одна запись xargs -0 может сказать, таким образом, это будет звонить cat с одним огромным именем файла, содержащим символы новой строки.

Здесь, если Вы хотите отсортировать список имен файлов, Вам нужен любой для использования GNU sort с -z опция:

find subdir -type f -print0 | sort -z | xargs -r0 cat > merge.txt

Или предположите, что имена файлов не содержат символы новой строки и работают:

find subdir -type f | sort | tr '\n' '\0' | xargs -r0 cat > merge.txt

Так как Вы использовали zsh тег, можно также выполнить во всем zsh:

autoload zargs
zargs subdir/**/*(D.) -- cat > merge.txt

Который на самом деле предоставит Вам порядок сортировки ближе к тому, что Вы ищете.

4
27.01.2020, 21:55

xargs' -0 аргумент для того, когда вход NUL-разделяется, который это не. Если Вы хотите, чтобы это работало, необходимо отделиться с NULs в предыдущих командах. К сожалению, кажется, нет никакого способа сделать этот POSIX совместимым:

find ./subdir/* -print0 | sort -z | xargs -0 cat -- > full_merge.txt
2
27.01.2020, 21:55
  • 1
    Обычно это find -print0 | sort -z | xargs -0 –  frostschutz 28.05.2013, 17:54
  • 2
    Да, я пытался сделать его как POSIX совместимым как возможный. К сожалению, POSIX xargs не поддерживает -0 все же. –  l0b0 28.05.2013, 17:57
  • 3
    И согласно POSIX, sort не требуется, чтобы обрабатывать нетекстовые данные. И -t должен указать разделителя полей, не строку/разделитель записей. –  Stéphane Chazelas 28.05.2013, 19:16
  • 4
    Ой, исправленный. –  l0b0 29.05.2013, 11:23

Теги

Похожие вопросы