Как считать команды из файла?

Сообщение об ошибке указывает на это ( выполнялся как команда, что означает, что одна из обратных косых черт, используемых для продолжения строки, является на самом деле не последним знаком строки. Удостоверьтесь, что нет никакого пробела. Удостоверьтесь, что Вы используете окончания строки Unix (LF только, никакой CR).

Жалоба от find о недопустимом выражении происходит из-за тех запятых. Просто удалите их.

find "$target" \
        \( ! -group "$project" -exec chgrp "$project" {} \;   \) \
        \( ! -user "$owner" -exec chown "$owner" {} \;        \) \
        \( ! -perm "$perms" -exec chmod "$perms" {} \;        \) \
        \( -type d -exec chmod g+s {} \; \)

Вы, вероятно, сэкономите время, выполняя команды однажды на пакет файлов вместо однажды на файл. Это не гарантируется здесь потому что chown, chgrp и chmod вызовы могут продолжиться на различных уровнях, таким образом, записи каталога могут быть выселены из кэша, но я дал бы ему движение.

find "$target" \
        \( ! -group "$project" -exec chgrp "$project" {} +   \) \
        \( ! -user "$owner" -exec chown "$owner" {} +        \) \
        \( ! -perm "$perms" -exec chmod "$perms" {} +        \) \
        \( -type d -exec chmod g+s {} + \)

chgrp, chmod и chown ничего не сделайте, если файл уже имеет правильные метаданные, таким образом, Вы могли назвать их безусловно. Выполнение их напрасно вызывает больше вызовов, как бы то ни было. Утилиты будут звонить stat снова после find сделал так, но inodes, очень вероятно, все еще будут в кэше, таким образом, это сможет стоить. Можно сохранить вызов путем объединения chgrp в chown.

find "$target" -exec chown "$owner:$project" {} + \
        -exec chmod "$perms" {} + \
        -type d -exec chmod g+s {} +
3
16.09.2017, 04:35
2 ответа

Создайте myFileWithCommands.txt :

php index.php import file1 --offline
php index.php import file2 --deleteUnused
php index.php import file3

Затем запустите параллельно следующим образом:

parallel -j 3 -- < myFileWithCommands.txt
5
27.01.2020, 21:12

Я могу себе представить два простых способа сделать это. Вы можете передать содержимое файла по конвейеру parallel или написать сценарий оболочки. Если все, что вы хотите выполнить, - это конкретный набор задач, то сценарий оболочки может иметь больше смысла. Это было бы очень коротко, мило и по существу:

#!/bin/sh
parallel -j 3 -- "php index.php import file1 --offline" "php index.php import file2 --deleteUnused" "php index.php import file3"

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

Самый простой способ сделать это - включить в текст дословные команды, которые вы хотите выполнить.

Например, если бы это был ваш текстовый файл ( test.txt ):

"php index.php import file1 --offline" "php index.php import file2 --deleteUnused" "php index.php import file3"

Затем вы могли бы запустить следующее, и все могло бы работать нормально:

$ cat test.txt | parallel -j 3 -- 

Вы также можете поэкспериментировать с немного более сложный формат файла (например, каждая команда в новой строке и не в кавычках). Если бы вы пошли по этому пути, вам нужно было бы провести небольшой синтаксический анализ файла перед его подключением к parallel , что можно было бы довольно легко сделать, например, с помощью awk .

Однако, если вы решите создать более гибкий формат файла, подобный этому, может быть полезно создать вспомогательный сценарий оболочки (или функцию), которая избавит вас от необходимости вводить awk '<любые шаблоны, которые вы соответствуете > {сделай что-нибудь} '| parallel -j3 - каждый раз.

2
27.01.2020, 21:12

Теги

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