Bashでサブディレクトリなしでファイルディレクトリを繰り返す方法

Bashでサブディレクトリなしでファイルディレクトリを繰り返す方法

ファイルとサブディレクトリを含むディレクトリを解析する必要がありますが、findコマンドは使用できません。 forループは各ファイルを通過して他のディレクトリと比較する必要がありますが、サブディレクトリを通過させることはできません。

difference=0
for item in $1
do 
     if [[ -d $item ]]
     then 
             continue
     fi
     if [ ! -f "$2/$(basename $item)" ]
     then
          echo "$2/$(basename $item) is missing"
          difference=1 
     fi
     if [ diff $item "$2/$(basename $item)" ]
     then
          echo "$1/$(basename $item) is different"
          difference=1
     fi
done 

上記のコードを使用すると、サブディレクトリはスキップされますが、ファイルも比較しません。続いて、最初のif文を省略して次のように入力すると、次のことがわかります。

for item in $(find $1 -type f)

動作しますが、その機能は使用できません。どんな助けでも大変感謝します。そして、このディレクトリと比較する別のディレクトリがありますが、コードが同じなので記録しませんでした。

答え1

これが問題に対する最も自然な解決策です。

find . -type f -maxdepth 1  |  ...

この機能は使用できません。

/usr/bin/find 実行を妨げる設定制約を記述するように質問を更新します。


ただし、ファイルも比較しません。

     if [[ -d $item ]]
     ...
     if [ ! -f "$2/$(basename $item)" ]
     ...
     if [ diff $item "$2/$(basename $item)" ]

繰り返しが良いです。

あなたが望む最後の条項は

     if diff $item "$2/$(basename $item)"

つまり、()なしで終了状態をif見たいと思います。difftest[

次の2行の違いを確認してください。

     if [ diff $item "$2/$(basename $item)" ]
     if   diff $item "$2/$(basename $item)"

bashにいくつかのサンプル質問をしましょう。

$ if   true;    then echo Yes; fi
Yes
$ if   false;   then echo Yes; fi
$ if [       ]; then echo Yes; fi
$ if [ true  ]; then echo Yes; fi
Yes
$ if [ false ]; then echo Yes; fi
Yes
$ if [ apple ]; then echo Yes; fi
Yes

[bashの組み込みは/usr/bin/testの同義語である/usr/bin/[とほぼ同じです。また、ここでは/usr/bin/trueと/usr/bin/falseを呼び出します。 1と0の終了状態を提供します。このうち4つのケースではフォークしません。どの子プロセス


スクリプトを書くときにリンターが役に立つかもしれませんshellcheck

関連情報