私は現在のユーザーが読むことができないファイルを見つけるためにいくつかのコードを書いています。それは私が、たとえ読み込み不可能であると報告したファイルのループの外側のスクリプトの下で明示的にテストしたとしても、ファイルが親フォルダのサブディレクトリで読み取られないというメッセージを私に与えています。しかし、私はチェックして、すべてのファイルが読み取り許可するように設定されているグループのアクセス許可を持っていると私はそれらのいくつかを開くために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
============
はちょうど 'LSを追加します - $ {files [$ i]} '入力をデバッグするには?また、typical unix/linuxのcmd-lineオプションは '-r'のようなものが最初になると期待しています。次に、 '' * "'を引用する必要はありません。単に、cmd行が処理されるファイルのリストを自然に展開するようにしてください。また、 'ls -l $ 1'の出力には"親フォルダのサブディレクトリにあるファイル..... "が含まれていることには驚きました。多分私は誤解しています。私たちが問題をテストできる1つのファイルを持つ1つのサブディレクトリを持つ小さな4つのファイルサンプルを作成した方が良いでしょう。がんばろう。 – shellter
$ i:$ {files [$ i]} "' forループ内の入力をデバッグするのは、サブディレクトリのファイルがサブディレクトリパスなしで配列に入力されていると述べたULickを示しています。ファイルテストが完了したときに、間違った場所にあるファイルを探しています。アスタリスクが引用符で囲まれていない場合、シェルはそれをスクリプトに渡す前に展開します。つまり、 '-r'が最後の引数(つまり引数$ 213)であることを意味します。私はおそらく、あなたが順序が典型的ではないと言ったように、それを防ぐために引数の順序を切り替えることができます。 –
'ls -l'はファイル引数が' * 'のときにサブディレクトリをリストします。パターン(つまり '* .sh')やすべてのファイルを検索できるようにスクリプトを柔軟にしたいので、引数' ls -l $ 1'を入力する必要がありました。しかし、これはすべてのファイルを検索するために、すべてのファイルを取得する引数に何かを割り当てる必要があることを意味します。残念ながら、これは 'ls'にサブディレクトリの一覧を表示するようにも指示します。 –