LINUX.ORG.RU

Bash - работа со списком названий файлов

 


0

2

Добрый день.

Код Bash:

#!/bin/bash
folder=/home/lily/My/log
cd $folder
read dm3</home/lily/My/dm3.txt
read d3</home/lily/My/d3.txt
EXT=log
for aa in `find -maxdepth 1 -name "*.${EXT}" | sed "s/\.${EXT}\$//"`; do
    if [ $aa -le d3 ]; then
        echo END1
    else
        echo END2
    fi
done
run.sh: line 11: [: ./20141016: integer expression expected
END2

Я так понимаю, переменная аа - не того формата, поэтому не может сравниваться с другой переменной. Помогите пожалуйста

P.S. Не совсем понятно, в какой теме задавать вопросы по bash, поэтому приношу извинения, если размещаю его не там где надо.

быть может имелось ввиду значение переменной $d3?

anonymous ()

run.sh: line 11: [: ./20141016: integer expression expected

Кажется оно пытается числа сравнивать. А что ты имел в виду?

sin_a ★★★★★ ()

Ты хочешь проверить файлы /home/lily/My/log/*.log и если этого файла нет в /home/lily/My/d3.txt вывести «END1», если есть то «END2»? Тогда я тебе предложу такой вариант:

read d3</home/lily/My/d3.txt

for item in /home/lily/My/log/*.log
  do
    if [[ ${item =~ $d3 ]]
      then
        echo END2
      else
        echo END1
     fi
done

А вот что ты там с «расширениями» делаешь не понятно. Короче говря опиши задачу и приведи пример того, что лежит в каталоге и в файлах dm3.txt и d3.txt.

alozovskoy ★★★★★ ()
./20141016: integer expression expected

Что тебе здесь не понятно? У тебя aa="./20141016", что не есть число.

Сделай аргумент sed таким: "s/.*\\/\\([^/]*\\)\\.${EXT}/\\1/g"

Kroz ★★★★★ ()
Последнее исправление: Kroz (всего исправлений: 2)

Да, и приобщайся к культуре программирования:
- почаще заключай строковые константы в кавычки;
- если скрипт имеет дело с файлами в каталоге пользователя, лучше ссылаться на «домашний каталог пользователя», а не на абсолютный путь;
- все каталоги и файлы лучше заносить в переменные вначале скрипта, получится что-то типа конфига;
- если переходишь в другой каталог, сохраняй предыдущий и восстанавливай вконце.

folder="~/My/log"
FILE_DM3="~/My/dm3.txt"
FILE_D3="~/My/d3.txt"

pushd "$PWD" > /dev/null
cd "$folder"
read dm3<"$FILE_DM3"
read d3<"$FILE_D3"
EXT="log"

...

popd > /dev/null

Я уже не говорю о том, что в твоей программе менять каталог ни к чему:

for aa in "$folder/"*".$EXT"; do

Kroz ★★★★★ ()
Ответ на: комментарий от Deleted

Это мой вопрос. Я ее решила на винде в cmd, сейчас переделываю на юникс подобную ОС. Вот часть задачи на винде, именно та, которую не могу переделать:

setlocal enabledelayedexpansion

for  /f %%i in ('dir /a-d/b *.log') do (
set aa=%%~ni
echo !aa!
set aa>>E:\1.txt
if !aa! leq %d3% (
"C:\WinRAR\rar.exe" u -ep "E:\log\!aa!.rar" "E:\log\!aa!.log")

if !aa! leq %dm3% (
"C:\WinRAR\rar.exe" u -ep "E:\copy_log\Copy.rar" "E:\log\!aa!.log")

)

То, что сейчас на юниксе:

#!/bin/bash
folder=/home/lily/My/log
cd $folder
read dm3</home/lily/My/dm3.txt
read d3</home/lily/My/d3.txt
EXT=log
for aa in `find -maxdepth 1 -name "*.${EXT}" | sed "s/\.${EXT}\$//"`; do
    if [ $aa -le d3 ]; then
        echo END1
    else
        echo END2
    fi

done


run.sh: line 11: [: ./20141016: integer expression expected
END2

Я сравниваю числа аа и d3 потом аа и dm3, ЕND1 и ЕND2 позже заменю...В каталоге /home/lily/My/log содержатся логи вида:
20141112.log
20141111.log
20141110.log
.........
Эти логи и есть переменная аа (без расширения),которая сравнивается с d3 и dm3 (они тоже имеют такой вид - 20140909)
islily ()
Ответ на: комментарий от sin_a

Все верно, это и нужно...Более подробно о задачке, я ответила chinarulezz (07.12.2014 14:32:40)

islily ()
Ответ на: комментарий от alozovskoy

Я не хочу проверить, я хочу сравнить их. Более подробно описала выше.

islily ()
Ответ на: комментарий от islily

в d3 и dm3 - в каждой переменной одна дата - разная, полученная вычислениями сделанными ранее

islily ()
Ответ на: комментарий от anonymous
#!/bin/bash -x
folder=/home/lily/My/log
cd $folder
read dm3</home/lily/My/dm3.txt
read d3</home/lily/My/d3.txt
EXT=log
for aa in `find -maxdepth 1 -name "*.${EXT}" | sed "s/\.${EXT}\$//"`; do
    if [ $aa -le d3 ]; then
        echo END1
    else
        echo END2
    fi

done

Результат
run.sh: 11: [: Illegal number: ./20141016
END2
islily ()
Ответ на: комментарий от islily

их ровно столько, сколько логов в папке

run.sh: 11: [: Illegal number: ./20141016
END2
run.sh: 11: [: Illegal number: ./20141015
END2
run.sh: 11: [: Illegal number: ./20141014
END2

..........

islily ()
Ответ на: комментарий от islily

а если так?

#!/bin/bash -x
folder=/home/lily/My/log
cd $folder
read dm3</home/lily/My/dm3.txt
read d3</home/lily/My/d3.txt
EXT=log
for aa in `find -maxdepth 1 -name "*.${EXT}" | sed "s,^.\/\(.*\)\.${EXT}\$,\1,"`; do
    if [ $aa -le d3 ]; then
        echo END1
    else
        echo END2
    fi
done

anonymous ()
Ответ на: комментарий от islily

d3 - переменная. Где знак $ ?
И всегда используй [[ вместо [
Для отладки программы выводи значения чтобы понять в чем ошибка; потом уберешь. А то можем споткнуться на том, что в файле что-то не так

echo "'$aa' - '$d3'" # Отладка
if [[ $aa -le $d3 ]]; then
Kroz ★★★★★ ()
Последнее исправление: Kroz (всего исправлений: 3)

BTW

read d3</home/lily/My/d3.txt
В файле d3.txt только одно значение на одной строке и без перевода строки?

Kroz ★★★★★ ()
Ответ на: комментарий от islily

отлично, минус одна ошибка, давай дальше, как уже не раз говорилось:

#!/bin/bash -x
folder=/home/lily/My/log
cd $folder
read dm3</home/lily/My/dm3.txt
read d3</home/lily/My/d3.txt
EXT=log
for aa in `find -maxdepth 1 -name "*.${EXT}" | sed "s,^.\/\(.*\)\.${EXT}\$,\1,"`; do
    if [ $aa -le $d3 ]; then
        echo END1
    else
        echo END2
    fi
done

anonymous ()
Ответ на: комментарий от anonymous

к d3 подставила $
и вроде отработал, сейчас ток проанализирую, правильно ли
во всех сроках мне выдал END1

islily ()
Ответ на: комментарий от anonymous

for aa in `find -maxdepth 1 -name «*.${EXT}» | sed «s,^.\/\(.*\)\.${EXT}\$,\1,»`; do

тут надо примерно так записывать:

for aa1 in *.$EXT; do
  aa="${aa1%$EXT}"

а вы написали быдлокод.

if [ $aa -le d3 ]; then

арифметика есть в bash:

if (( aa <= d3 )); then
emulek ()
Ответ на: комментарий от emulek

благодарю что поправили, на это и рассчитывал

anonymous ()
Ответ на: комментарий от islily

Я упустила его, сто раз перебирала этот скрипт, голова уже отказывается соображать

выполните команду: :>говноскрипт, и пишете с нуля. То, что вы тут написали никуда не годиться.

emulek ()
Ответ на: комментарий от islily

Мне еще писать его и писать..это только часть моего затупка

islily ()
Ответ на: комментарий от islily

Он работает и это главное

ССЗБ. Это он сейчас на этом локалхосте в данной фазе Луны «работает».

боюсь я его не перепишу

хочется ответить просто и по-русски. Но СППФ, я угадал? Тогда страдайте, и продолжайтедоказывать тезис о том, что женщина-программист не лучше кобылы.

emulek ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.