5

Я хотел бы ограничить вывод команды find. В прошлом я использовал для этой команды ls, например:

ls *tgz|head -100|xargs -i mv "{}" ../

но я узнал, что результат может быть непредсказуемым, если имя файла содержит символ новой строки. Так что более правильный способ сделать это что-то вроде этого:

find ... -print0 | xargs -0

Но, используя этот подход, я не могу ограничить вывод команды find командой head - она показывает все имена файлов, разделенные специальным знаком ^ @:

 find . -name '*tgz' -print0|head -2|less

file1.tgz ^ @ file2.tgz ^ @ ^ @ file3.tgz file4.tgz ^ @ ^ @ file5.tgz

Есть ли способ избавиться от этой неловкости?

Я попытался решить это с помощью awk:

find . -name 'BATCHED*' -print0|awk 'BEGIN{RS=""}'

но он по-прежнему отображает все или нулевые строки.

Можно ли это решить с помощью awk? Есть ли лучшее решение?

КСТАТИ. Я нашел эту очень поучительную ссылку, но нет ответа на мой вопрос.

3 ответа3

3

Еще одна возможность для безопасного find:

while IFS= read -r -d '' -u 9
do
    let ++count
    if [[ count -gt 10 ]]
    then
        unset count
        break
    fi
    printf "$REPLY"
    printf "$\x00"
done 9< <( find /full/path -print0 )

Чтобы проверить, просто передайте это в это:

while IFS= read -r -d ''
do
    echo "START${REPLY}END"
done
2

Проблема связана с тем, что xargs на слова, а команды типа head и tail ориентированы на строки. Одним из решений может быть не использовать xargs а вместо этого параллельный GNU.

0

Я полагаю, что вы ищете аргумент --max-args или --max-lines для xargs, в зависимости от вашего формата ввода:

# Run less on no more than two files at a time
find . -type f -print0 | xargs --null --max-args=2 less

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .