Много дистрибутивов Linux имеют mountpoint
команда. Это может явно используемый, чтобы проверить, является ли каталог точкой монтирования. Простой как это:
#!/bin/bash
if mountpoint -q "$1"; then
echo "$1 is a mountpoint"
else
echo "$1 is not a mountpoint"
fi
GNU head
и tail
с тех пор coreutils версия 8.25 имеют a -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
, a \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
) – Thedward 13.11.2014, 00:02-print0 | tr '\n\0' '\0\n'
имеет строки, представляющие пути к файлам, где символы новой строки в них были преобразованы в\0
. Так, если Вы проводите первую строку сhead -n 1
и преобразуйте\0
s назад к новым строкам сtr '\0\n' '\n\0'
снова, Вам NUL-разграничили первый путь к файлу с его встроенными символами новой строки. – Stéphane Chazelas 13.11.2014, 00:08