2014-02-10 1 views
0

У меня есть цикл while, который будет получать имена файлов и запускать команды. Довольно стандартный материал. То, что я хочу сделать, это сортировать файлы, которые я кормлю в Do While цикл, а затем в течение 1-го файла, который я хочу запустить Command1 и для остальной части их Command2Сделайте во время цикла. Сделайте исключение для первой записи и продолжайте цикл, как обычно.

find $dir -iname "$search*" |<some commands> | sort -nr 
while read filename; do 
# if its the very 1st file . head - 1 would do that 

echo "command1 > log > 2>&1& " >> appendfile 
echo "if [ $? != 0 ] then ; exit 1 fi " >> appendfile 

# for all other files do this 
echo "command1 > log > 2>&1& " >> appendfile 

Теперь вы видите, что я делаю слишком. Я пишу материал в appendfile.ksh, который будет запущен позже. Я выбираю первый файл, который является наименьшим по размеру как «тестовый файл» для запуска команды 1. Если задание завершается аварийно, что выход еще продолжать обработку остальных файлов Я пытаюсь способом, как разместить 1-ый файл, который входит в Do While с немногими специальной обработкой

ответ

1

Используйте команду соединения потреблять имя файла отдельно, перед началом цикла в while. Это дает вам возможность добавить весь вывод составной команды в appendfile с одним перенаправлением без необходимости перенаправления каждой команды echo отдельно. Обязательно обратите внимание на исправленный синтаксис перенаправления для каждой команды.

find $dir -iname "$search*" |<some commands> | sort -nr | { 
    # This read gets the first line from the pipeline 
    read filename 
    echo "command1 > log 2>&1 " 
    echo "if [ $? != 0 ] then ; exit 1 fi " 

    # These reads will get the remaining lines 
    while read filename; do 
     echo "command2 > log2 2>&1 " 
     echo "if [ $? != 0 ] then ; exit 1 fi " 
    done 
} >> appendfile # If appendfile isn't written to before, you can just use > 

И еще один бит непрошеный совет: вы можете сократить свой скрипт, выполнив

command1 > log 2>&1 || exit 1 

вместо использования явного if заявление.

2

Вы можете сделать это следующим образом:

first="" 

while read filename; do 
    if [ -z "$first" ]; then 
    first="$filename" 
    # if its the very 1st file . head - 1 would do that 
    echo "command1 > log > 2>&1& " >> appendfile 
    echo "if [ $? != 0 ] then ; exit 1 fi " >> appendfile 
    else 
    # for all other files do this 
    echo "command2 > log > 2>&1& " >> appendfile 
    fi 
done < <(find "$dir" -iname "$search*" | <some commands> | sort -nr) 
4
#!/bin/bash 
f=1 
find . -name "*.txt" | while IFS= read -r filename 
do 
    if [ $f -eq 1 ]; then 
     echo First file 
    else 
     echo Subsequent file 
    fi 
    ((f++)) 
done 
+0

+1 но 'while read filename' должно быть' while IFS = read -r filename', если OP специально не хочет вырезать пробелы из имен файлов и интерпретировать обратные слова. –

+1

Спасибо, Ред. Я знаю об этом, но сфокусирован на принципе «f = 1, если [..]; ((f ++))», а не корректирует/критикует метод петли OP. Я обновляю свой ответ, чтобы «плохой пример» исчез. Еще раз спасибо. –

Смежные вопросы