Как избежать бесполезного использования кошки при парсинге файла?

ZFS несколько продемонстрировал рост, или уменьшение файловой системы бессмысленно.

Файловая система ZFS может, но не требоваться, чтобы иметь предопределенный размер. В последнем случае нет никакой потребности уменьшить файловую систему, учитывая факт нет никакого потраченного впустую пространства, в отличие от большинства если не все другие файловые системы.

Конечно, базовые физические устройства имеют полный предел, но нет никакой потребности добавить произвольные пределы.

7
19.12.2011, 18:00
6 ответов

Предложение APROGRAMMER использования xargs является часто лучшим, но другая опция состоит в том, чтобы использовать перенаправление в a while цикл, который позволяет дополнительным командам быть сделанными и переменные, которые будут установлены:

while read -r dir; do mkdir $dir; done < myfile

Пример более сложной структуры был бы:

now=`date +%Y%m%d.%H%M%S`
while read -r dir; do
    newdistfile="/tmp/dist-`echo $dir | tr / _`.tgz"
    mv $dir ~/backups/$dir.$now &&
        mkdir $dir &&
        tar xzfC $newdistfile $dir
done < myfile

Это не что-то это xargs мог обойтись без записи 'программы помощника'.

13
27.01.2020, 20:13
  • 1
    Что является пределами использования xargs read? Это - мое понимание это xargs разветвит новый процесс (в отличие от этого, read это - встроенная оболочка). Разве это не что-то, чего Вы хотите избежать? –  rahmu 19.12.2011, 18:40
  • 2
    xargs будет воздействовать на единственную команду, поэтому если Вы захотите иметь составной оператор (как больше чем один, if, while или for, и т.д.), или установка переменной, затем Вы не можете использовать xargs. Да, xargs разветвит один новый оператор плюс один для некоторого количества входных строк, которое является очень мало служебным. Однако некоторые более старые версии xargs не берите a -0 опция, таким образом, a while read будет способ пойти, если может быть пробел во входных именах каталогов. –  Arcege 19.12.2011, 19:38

Я сделал бы что-то как

xargs mkdir < myfile
11
27.01.2020, 20:13
  • 1
    Почему "-n 1"? Можно сделать несколько каталогов с одним вызовом mkdir. –  ddeimeke 19.12.2011, 18:29
  • 2
    @ddeimeke, потому что я не помнил, является ли это POSIX или просто общее расширение. Теперь я проверил, и это находится в SUSv2. –  AProgrammer 19.12.2011, 18:39
  • 3
    Бесполезное использование xargs. ;) –  user unknown 19.12.2011, 21:25

По крайней мере, в ударе, пока нет никаких имен файлов, содержащих пробелы и новые строки, это:

mkdir $(< myfile) 

работы. Таким образом, у нас есть бесполезное использование for, xargs также.

<не запускает новый процесс в ударе, в отличие от cat, но я не знаю для ksh.

10
27.01.2020, 20:13
  • 1
    +1 для разъяснения, в противоположность другому ответу, проблеме пробелов. –  enzotib 19.12.2011, 22:05

Это - решение ближе Вашего исходного сценария, все еще избегающего бесполезной кошки

for dir in $(<myfile); do mkdir $dir; done

Это все еще содержит бесполезный цикл все же.

3
27.01.2020, 20:13

Я не сказал бы, что это - бесполезное использование кошки.

В классическом смысле UUOC означает писать:

cat file | some_command and its args ...

вместо эквивалента и более дешевый

<file some_command and its args ...

или (эквивалентно и более классически)

some_command and its args ... < file

В этом случае:

for dir in $(cat myfile); do mkdir $dir; done

нет никакой команды в который вывод cat передается по каналу.

Существуют, конечно, альтернативы, которые не используют cat. В частности, для удара и ksh $(<myfile) вероятно, будет быстрее, чем $(cat myfile), хотя не вся поддержка оболочек та конструкция. Но я не называл бы исходный код "бесполезным использованием кошки" больше, чем я назову решение APROGRAMMER "бесполезным использованием xargs".

2
27.01.2020, 20:13

С bash 4 и ограниченным ARG_MAX

mapfile -t <file && mkdir -- "${MAPFILE[@]}"
1
27.01.2020, 20:13

Теги

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