Скажем, у меня есть list.txt файлов, которые я хочу проверить.

cat list.txt

и для каждого файла я хочу выполнить действие

cat list.txt | xargs -I {} touch {}

Но в зависимости от исхода акции я хочу соответственно отреагировать:

cat list.txt | xargs -I {} touch {} | if [-z - ]; then echo "blank file"; fi;

Это не работает должным образом, и я не уверен, почему нет ... Итак, как я могу правильно протестировать значение stdout -? - и, в качестве бонуса, как передать содержимое {} в последнюю часть? Для эффекта:

cat list.txt | xargs -I {} touch {} | if [-z - ]; then echo "{} is a blank file"; fi;

Возможно, это должен быть полный сценарий bash, но я бы предпочел, если бы я мог научиться делать это в одну строку, поскольку приложения для этого могут быть полезны во многих отношениях -

Вот более практичный пример:

time john -incremental -stdout | grep 'clientsWeakPassword' | if [ ! -z - ]; then exit 0;

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

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

Но эту цепочку также можно использовать для проверки определенной вещи в файлах журналов и т.д. И т.д. И т. П.

Во всяком случае, я надеюсь, что кто-то может направить меня в правильном направлении.

Большое спасибо -

1 ответ1

1

Если вы хотите сделать больше, чем одну вещь, создайте оболочку:

xargs -t sh -c '
    for f; do
        touch "$f"
        [ -s "$f" ] || echo "$f is zero size or does not exist" 
    done
' - < list.txt

Но к этому моменту вы могли бы также использовать цикл while read while вместо xargs.

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