ошибка в скрипте

24spam@tut.by
Дата: 23.03.2010 01:14:53
Здравствуйте.
Написал простенький скрипт, но никак не могу его запустить. Задача стояла сравнить все файлы директории с каким-то файлом, находящимся внутри этой директрории (например, это будет 1.exe). Вроде всё просто, но ошибка (как я понял) в синтаксисе не позволяет запустить скрипт. Проверил, - вроде синтаксис правильный. Интерпретатор ругается на строку проверки условия. Подскажите как исправить?




#!/bin/bash

for file_for_check in 'ls -1'
do
      if [ cmp --silent file_for_check 1.exe ]; then 
          file_for_check > equal_files_list.txt
          echo file_for_check
      fi
done

env
Дата: 23.03.2010 09:06:29
24spam@tut.by,

ls -l не то же самое, что ls -1
Мутаген
Дата: 23.03.2010 10:35:13
[ ] - тут лишние.
вместо ls -1 можно просто написать *
ну и это должно выглдяеть так, скорее всего:
echo $file_for_check > equal_files_list.txt
echo $file_for_check
24spam@tut.by
Дата: 23.03.2010 22:31:53
Спасибо за попытки помочь. Но к сожалению, скрипт по-прежнему не работает. Кстати, в первоначальной версии у меня стояло именно ls -1, а не ls -l.
2 Мутаген

После ваших исправлений интерпретатор больше не ругается, но выходной файл не создаётся и на экран ничего не выводится. Как исправить?
BlackStar
Дата: 24.03.2010 01:24:23
Создадим контрольный пример

for i in 10 20 30 40 50; do
for n in `seq 1 $i`; do echo $i >> a$i.exe; done
done

for n in `seq 1 28`; do echo 30 >> fail.dll; done
echo FA-IL >> fail.dll;

cp a30.exe wow1.exe
cp a30.exe wow2.bin
ls -la
итого 40
drwxr-xr-x 2 bs bs 4096 2010-03-24 00:35 .
drwxr-xr-x 12 bs bs 4096 2010-03-24 00:20 ..
-rw-r--r-- 1 bs bs 30 2010-03-24 00:35 a10.exe
-rw-r--r-- 1 bs bs 60 2010-03-24 00:35 a20.exe
-rw-r--r-- 1 bs bs 90 2010-03-24 00:35 a30.exe
-rw-r--r-- 1 bs bs 120 2010-03-24 00:35 a40.exe
-rw-r--r-- 1 bs bs 150 2010-03-24 00:35 a50.exe
-rw-r--r-- 1 bs bs 90 2010-03-24 00:35 fail.dll
-rw-r--r-- 1 bs bs 90 2010-03-24 00:35 wow1.exe
-rw-r--r-- 1 bs bs 90 2010-03-24 00:35 wow2.bin

Вот скрипт test.sh

#!/bin/bash

FN=a30.exe
FSIZE=`ls -la $FN | cut -d ' ' -f 5`
REPORT=report.log

if [ -f $REPORT ]; then
    rm -f $REPORT
fi

for file in `find . -maxdepth 1 -size ${FSIZE}c -type f -print | xargs`; do
    if [ "$file" != "./$FN" ]; then
	if cmp --silent $FN $file; then
	    echo $file >> report.log;
	    echo $file;
	fi
    fi
done

а вот и результат


bs@Orion:~/prj/a$ ./test.sh
./a30.exe
./wow1.exe
./wow2.bin
bs@Orion:~/prj/a$ cat report.log
./a30.exe
./wow1.exe
./wow2.bin
bs@Orion:~/prj/a$

--
There Ain't No Such Thing As A Free Lunch
BlackStar
Дата: 24.03.2010 01:26:17
Вернее результат такой

bs@Orion:~/prj/a$ ./test.sh
./wow1.exe
./wow2.bin
bs@Orion:~/prj/a$ cat report.log
./wow1.exe
./wow2.bin
--
There Ain't No Such Thing As A Free Lunch
24spam@tut.by
Дата: 30.03.2010 00:58:37
Спасибо всем за помощь. Задача немного модифицировалась.

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

Вот текущая версия скрипта. Он выводит в файл else-ветвь.


#!/bin/bash

dir1=$1
dir2=$2

i=0
truncate -s 0 equal_files.txt

files1=`ls $1`
files2=`ls $2`

for file1 in `ls $1`
do
    
    if [ -f $(file1) ]
    then

         for file2 in `ls $2`
         do

           if [ -f $(file2) ]         
           then
                  
              i=$((i+1))

              #if [ cmp $file1 $file2 ]
                
              are_equal=`diff $file1 $file2`
              #echo $are_equal
                 
              if [ $are_equal -eq 0 ] 
              then
                 echo $i $file1  $file2 "are equal"
                 echo $i $file1  $file2 "are equal" >> equal_files.txt
              else
                 echo $i $file1  $file2 "are not equal"
                 echo $i $file1  $file2 "are not equal" >> equal_files.txt
              fi
              
           
           fi


         done
    fi
    

done

Проблема в блоке проверки условия на тождественность файлов. Я уже все варианты пробовал - и с cmp и с diff. Не могу сделать корректно проверку на равенство файлов. При любых двух файлах условие получается ложным. Просьба не пинать ногами. Помогите, пожалуйста, исправить ...
BlackStar
Дата: 30.03.2010 01:56:55
Пипец!

Дружище, задача diff - найти различия между двумя почти равными файлами.
И показать эти различия. Сравнивать файлы байт за байтом - задача cmp.

Далее вы пишите
for file1 in `ls $1`
do
   ... [skip] ...
done

Вы хотя бы потрудились посмотреть ЧТО это даст вам в file1?
Видимо нет. Раз продолжаете упорствовать в играх с ls.
Возьмите пример который вам предоставили, наверните на него сверху
еще один цикл, и получите то что хотели.

--
There Ain't No Such Thing As A Free Lunch
BlackStar
Дата: 30.03.2010 02:05:34
ЗЫ Боджи мой, спаси нас от графоманов!
--
There Ain't No Such Thing As A Free Lunch