2016-07-05 4 views
2

それぞれに特定のスクリプトとサポートファイルを含むサブディレクトリを含むディレクトリがあります。これらのディレクトリのそれぞれに適切なファイルがあることを確認する必要があります。これらのディレクトリは、いつでも変更することができますので、私はbashのを使用したい(と思う)と配列サブフォルダ内のコンテンツを検索して確認する

find . -maxdepth 1 -type d -not -name home -not -name lhome -print 

に適切subdirectoresを返し、次のコマンドを格納し、これらのディレクトリのそれぞれが適切に含まれていることを確認したいですファイル:

file1 file2 file3.sh file4.conf

それは、特定のディレクトリにそれらのファイルが含まれていない場合は、私が問題とファイルが不足しているしているディレクトリを知る必要があります。その目標を達成するための最良の/適切な方法は何ですか?たぶんbashは間違ったツールで、perlや何かがうまくいくでしょうか?

+0

Bashは動作しますが、その場合はPythonまたはPerlを使用します。結果をコンソールに出力するだけでいいですか? – Martin

答えて

2

は、より統合された方法があるかもしれませんが、ここでの私のショットです:このfindはまた、現在のディレクトリを返すこと

while read -rd '' directory; do 
    files=("file1" "file2" "$directory.sh" "$directory.conf") 
    for file in "${files[@]}"; do 
     if [ ! -e "$directory/$file" ]; then 
      echo "$directory is missing $file" 
     fi 
    done 
done < <(find . -maxdepth 1 -type d -not -name home -not -name lhome -print0) 

注意。それを避けるには、-mindepth 1オプションを追加するとよいでしょう。

また、スクリプトにするには、の配置.$1に置き換えて、ターゲットをより柔軟に指定することができます。

+0

ニース:)私の提案は、非標準のディレクトリ名を扱うために 'read'を使ってfindと' -d '' 'と' -print0'を使うことでしょう – sjsam

+0

もし、 file3.shとfile4.confの名前が同じであることを忘れていますか?あなたはそれを持つようになる前に、その変数をどうやって得るのですか? –

+0

は、最初のレベルのループでFILESを定義し、既存の '$ directory'変数を使用します。 'FILES =" file1 file2 $ directory.sh $ directory.conf "' – Aaron

0

私はこのような何かがうまくいくかもしれないと思う:

shopt -s nullglob extglob 
diff <(while IFS= read -r f; do printf "%s\n" "$f/"{file1,file2,file3.sh,file4.conf}; done < <(printf "%s\n" !(home|lhome))) \ 
    <(printf "%s\n" !(home|lhome)/{file1,file2,file3.sh,file4.conf}) 

基本的に何が起こっていることは、すべての可能なファイルのリストは、whileループによって生成されていることである何かのように:その後、別の

c/file1 
c/file2 
c/file3.sh 
c/file4.conf 
d/file1 
d/file2 
d/file3.sh 
d/file4.conf 

リストは既存のファイルで生成されます:

c/file1 
c/file2 

違いを見つけるために2つのリストを比較します

2,5d1 
< c/file2 
< c/file3.sh 
< c/file4.conf 
< d/file1 
7,8d2 
< d/file3.sh 
< d/file4.conf 

をあなたが期待されるファイルのリストが二度書かれているいずれかの、これはいくつかの深刻な欠点を持って見ることができるように。また、各リストはメモリに格納されているため、多くのディレクトリが存在すると問題が発生します。

関連する問題