GNU, head
а tail
оскільки coreutils версії 8.25 мають -z
для цього можливість.
Для старих версій або для систем, що не належать до GNU, ви можете спробувати змінити \0
і \n
:
find ... -print0 |
tr '\0\n' '\n\0' |
head |
tr '\0\n' '\n\0'
Зауважте, що деякі head
реалізації не можуть впоратися з символами NUL (а POSIX їх не вимагає), але там, де знаходять підтримку -print0
, head
текстові утиліти зазвичай підтримують символи NUL.
Ви також можете використовувати функцію, щоб обернути будь-яку команду між двома tr
s:
nul_terminated() {
tr '\0\n' '\n\0' | "$@" | tr '\0\n' '\n\0'
}
find ... -print0 | nul_terminated tail -n 12 | xargs -r0 ...
Майте на увазі, що під nul_terminated
, \0
означає, символ нового рядка. Так, наприклад, замінити \n
на _
:
find . -depth -name $'*\n*' -print0 | nul_terminated sed '
p;h;s,.*/,,;s/\x0/_/g;H;g;s,[^/]*\n,,' | xargs -r0n2 mv
( \x0
є також розширенням GNU).
Якщо вам потрібно виконати більше однієї команди фільтрації , ви можете зробити:
find ... -print0 |
nul_terminated cmd1 |
nul_terminated cmd2 | xargs -r0 ...
Але це означає виконати кілька зайвих tr
команд. Можна також запустити:
find ... -print0 | nul_terminated eval 'cmd1 | cmd2' | xargs -r0 ...
\x0
замість того,\n
щоб розмежовувати значення? (¹ щоб ви могли впоратися зі значеннями, які можуть містити\n
)