2017-04-20 9 views
0

私は現在のユーザーが読むことができないファイルを見つけるためにいくつかのコードを書いています。それは私が、たとえ読み込み不可能であると報告したファイルのループの外側のスクリプトの下で明示的にテストしたとしても、ファイルが親フォルダのサブディレクトリで読み取られないというメッセージを私に与えています。しかし、私はチェックして、すべてのファイルが読み取り許可するように設定されているグループのアクセス許可を持っていると私はそれらのいくつかを開くためにviを使用しました。ここで何が起こっているのですか?Linuxの条件付きファイルロジック

スクリプト:

#!/bin/ksh 
set -A files $(ls -1 $1) 
echo "${#files[@]}" 

for((i=0; $i < ${#files[@]}; i++)); do 
    if [ ! $2 ${files[$i]} ]; then 
    echo "${files[$i]} not $2" 
    fi 
done 

echo "============" 
if [ ! -r ./tmp/feederseries.txt ]; then 
    echo "./tmp/feederseries.txt not readable" 
fi 

出力:

$ testfiles.sh "*" -r 
212 
./buildhist: not -r 
20170109_124058.txt not -r 
20170109_124128.txt not -r 
./cmpatches: not -r 
tmp.txt not -r 
./reports: not -r 
archived not -r 
./tmp: not -r 
feederseries.txt not -r 
============ 
+0

はちょうど 'LSを追加します - $ {files [$ i]} '入力をデバッグするには?また、typical unix/linuxのcmd-lineオプションは '-r'のようなものが最初になると期待しています。次に、 '' * "'を引用する必要はありません。単に、cmd行が処理されるファイルのリストを自然に展開するようにしてください。また、 'ls -l $ 1'の出力には"親フォルダのサブディレクトリにあるファイル..... "が含まれていることには驚きました。多分私は誤解しています。私たちが問題をテストできる1つのファイルを持つ1つのサブディレクトリを持つ小さな4つのファイルサンプルを作成した方が良いでしょう。がんばろう。 – shellter

+0

$ i:$ {files [$ i]} "' forループ内の入力をデバッグするのは、サブディレクトリのファイルがサブディレクトリパスなしで配列に入力されていると述べたULickを示しています。ファイルテストが完了したときに、間違った場所にあるファイルを探しています。アスタリスクが引用符で囲まれていない場合、シェルはそれをスクリプトに渡す前に展開します。つまり、 '-r'が最後の引数(つまり引数$ 213)であることを意味します。私はおそらく、あなたが順序が典型的ではないと言ったように、それを防ぐために引数の順序を切り替えることができます。 –

+0

'ls -l'はファイル引数が' * 'のときにサブディレクトリをリストします。パターン(つまり '* .sh')やすべてのファイルを検索できるようにスクリプトを柔軟にしたいので、引数' ls -l $ 1'を入力する必要がありました。しかし、これはすべてのファイルを検索するために、すべてのファイルを取得する引数に何かを割り当てる必要があることを意味します。残念ながら、これは 'ls'にサブディレクトリの一覧を表示するようにも指示します。 –

答えて

2

配列は、これを行うために必要とされていません。とにかくファイルリストをループするのに、lsを使うのは最善の方法ではありません。説明はhttp://mywiki.wooledge.org/BashPitfalls#for_i_in_.24.28ls_.2A.mp3.29を参照してください。

ls -1 *とすると、実際のディレクトリには、サブディレクトリに ':'とそのサブディレクトリ内のファイルのリストが表示されます。サブディレクトリ内のファイルは、実際のディレクトリ(テストを実行する場所)に存在しないため、読み取り不可としてレポートされます。

は、シェルが拡張の世話をして、リストを反復処理してみましょう:

#!/bin/ksh 
for file in $1; do 
    if [ ! $2 $file ] ; then 
     echo "$file not $2" 
    fi 
done 

あなただけ読めるないファイルが必要な場合は、これを行うだろう:

find .. ! -perm /u=r -print 
+0

スクリプトを動作させるためのヒントをありがとう。私は実際に後でパーミッションをテストする 'find'の能力に直面しましたが、' find'を使うように言わなかったことをうれしく思います。私の誤解がこのスクリプトの作成のどこにあるのか知りたいのです。あなたはファイルをループすることに関するいくつかの重要な点を強調し、あなたが示唆したリンクは非常に有用です。ありがとうございました! –