2016-05-06 4 views
-1

У меня есть папка с большим количеством файлов, названных с непрерывным номером и некоторым текстом, но некоторые цифры отсутствуют. Я хочу записать все недостающие числа в файл.Bash write ls error to file

Вот что я получил до сих пор:

#!/bin/bash 
for ((c=23457; c<=24913; c++)) 
do 
    files=$(printf %q kassensystem/documents/"${c}") 
    ret=$(ls $files*) 
    echo "$ret" >> ./out.log 
done 

Выход выглядит так:

все существующие файлы записываются в файл, все ошибки в консоли. Я хочу именно так. Все ошибки (ls: ..file not found) записаны в файл!

Я попытался использовать полную команду ls $files* | grep -v 'kasse*', но тогда я получаю только файл с пустыми строками.

Благодарим за помощь!

+1

Сообщения об ошибках идут в 'stderr', вы только захватываете' stdout'. – Barmar

+0

'ls' никогда не должен использоваться для такого рода случаев. См. Http://mywiki.wooledge.org/ParsingLs - сама оболочка может расширять глобы для заполнения списков имен, поэтому вызов внешнего инструмента, созданного главным образом для генерации вывода для людей, бесполезен. –

+1

BTW, ставит 'out.txt' в цикле очень неэффективно - он * открывает файл * каждый раз, когда эта строка выполняется. –

ответ

2
exec 4>out.log # open output file just once, not once per write 

for ((c=23457; c<=24913; c++)); do 
    files=(kassensystem/documents/"$c"*) # glob into an array 
    [[ -e $files ]] || echo "$c" >&4  # log if first file in array doesn't exist 
done 
+0

Я думаю, что это решение лучше. плюс я только пишу цифры не весь stderr в файл – Tobi

1

Перенаправление только в stderr с использованием exec в верхней части, оставляя stdout появляться на терминале:

#!/bin/bash 

# redirect stderr to a file 
exec 2> out.log 

shopt -s failglob 
for ((c=23457; c<=24913; c++)) 
do 
    echo "kassensystem/documents/$c"* 
done 

shopt -s failglob будет писать в стандартный вывод, если соответствующие файлы нет.

+1

путь лучше, чем я пытался, спасибо! – Tobi

+0

Зачем использовать 'ls' для этого вообще? Весь подход - сообщения об ошибках синтаксического анализа - совершенно глупо. –

+0

Нет, я не рекомендую 'ls' проверять наличие некоторых файлов. Я просто сосредоточился на перенаправлении stderr. Но да, возможно, мне следовало бы более внимательно посмотреть внутри цикла 'for'. – anubhava