2016-07-19 12 views
0

私は2つのディレクトリのファイルを比較しようとしていますが、私の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(サブシェル)

補遺:(SP ASICでのコメントで述べたようにthx)の場合、$()をバッククォートとして使用してください。http://mywiki.wooledge.org/BashFAQ/082

+0

どちらの構文も、サブシェル内でコマンドを実行します。 –

+0

http://mywiki.wooledge.org/BashFAQ/082を参照してください。理由は '$()'がバックティックより優先される理由です。 – Sundeep

+0

そのリンクをありがとう! – Nidhoegger

関連する問題