2016-07-19 4 views
0

Я пытаюсь сравнить файлы в двух каталогах, но у меня возникают проблемы с тем, что моя команда stat работает правильно, я могу заставить ее работать из командной строки, используя тот же синтаксис, что и здесь. ,Сценарий Bash, команды с использованием подкаталога

# Usage: compdir <base_dir> <modified_dir> 

    # Handle MODIFIED and REMOVED files 
    for i in "${arr1[@]}" 
    do 
     REMOVED=1 
     for j in "${arr2[@]}" 
     do 
      if [ $i = $j ]; then 
       # take time stamps 
       dir1="$1" 
       dir2="$2" 
       stamp1=stat --format %Y "$i" <--------- THIS LINE 
       stamp2=stat --format %Y "$j" 
       if [[ $stamp1 > $stamp2 ]] ; then 
        echo "$j MODIFIED" 
       fi 
       REMOVED=0 
       break 
      fi 
     done 
     if [ $REMOVED -eq 1 ]; then 
      echo $i REMOVED 
     fi 
    done 
    # handle NEW files 
    for j in "${arr2[@]}" 
    do 
     NEW=1 
     for i in "${arr1[@]}" 
     do 
      if [ $j = $i ]; then 
       NEW=0 
       break 
      fi 
     done 
     if [ $NEW -eq 1 ]; then 
      echo "$j NEW" 
     fi 
    done 

На линии обозначенной < ------- и линию ниже я получаю ошибку --format: команды не найден. Я предполагаю, что это потому, что я находится в базовом каталоге, а не в подкаталогах. Поскольку переданные аргументы - это имена каталогов, которые я пытался сделать, например, «$ 1/$ i», чтобы заставить линию работать, но не повезло.

+2

Вам нужно использовать 'stamp1 = $ (stat --format% Y" $ i ")' и 'stamp2 = $ (stat --format% Y" $ j ")'. См. Http://www.shellcheck.net/ для проверки более синтаксических проблем. – Inian

ответ

3

Вы не можете просто назначить команду переменной, вы должны сделать это в подоболочке, используя $() или ``. Как здесь:

Вариант 1:

stamp1=$(stat --format %Y "$i") 

Вариант 2:

stamp1=`stat --format %Y "$i"` 

Я лично предпочитаю вариант 1 (подоболочка)

Приложение: Как указано в комментарии по уд СИС (thx), используйте $(), поскольку обратные элементы являются устаревшим синтаксисом, см .: http://mywiki.wooledge.org/BashFAQ/082

+0

Оба синтаксиса выполняют команду внутри подоболочки. –

+0

см. Http://mywiki.wooledge.org/BashFAQ/082 для почему '$()' предпочтительнее обратных ссылок – Sundeep

+0

Спасибо за эту ссылку! – Nidhoegger