ディレクトリ内のファイルを一致させて確認します。

ディレクトリ内のファイルを一致させて確認します。

ディレクトリ(/home/user/example)にファイルがあることを確認して一致させる必要があります。各ファイルには制御ファイルとデータファイルがあります。各ファイルに異なるファイルの対応項目があるかどうかを確認したいと思います。たとえば、example.ctlがexample.outと一致する場合、またはexample.outとexample.ctlにファイルがある場合です。

私は入れ子になったforループと多くのif elseステートメントを書きました。しかし、これは基本的なチェックをするには複雑すぎるようです。誰もがより良い解決策を持っていることを確認したかった。

ディレクトリのサンプルファイル:

example.ctl
example.out  
example_1.ctl
example_1.out  
example_2.ctl
example_2.out  

答え1

comm <(basename -a -s.ctl *.ctl | sort) <(basename -a -s.out *.out | sort)

comm(1)特に、フラグには両方のサフィックスがあるファイルのみがリストされ-12ます。

答え2

最初の亜種

すべてのファイル名を調べて、各ファイルにペアがあることを確認し、そのメッセージを印刷します。

for i in *; do
    base=${i%.*}
    if [ -e "${base}.out" -a -e "${base}.ctl" ]; then
        printf 'file "%s" has a pair\n' "$i"
    else
        printf 'file "%s" has not a pair\n' "$i"
    fi  
done

2番目の変形

.ctlただファイルを繰り返し、.ctl現在のファイルに-ファイルペアがあることを確認してください.out。したがって、ペアリングされたファイルのみを印刷し、残り(ペアリングされていないファイル)は無視します。

for i in *.ctl; do
    base=${i%.*}
    if [ -e "${base}.out" ]; then
        printf 'file "%s" has a pair "%s"\n' "$i" "${base}.out"
    fi
done

答え3

見つからない.ctlを検索しようとしています。そして.outファイルなので、両方の方法を確認する必要があります。これを行う簡単な方法(ファイル名にスペースを含む特殊文字がなく、ドットのみが含まれている場合)は次のとおりです。

  1. 以下を含むすべてのfind . -type fファイルを検索します。
  2. 、を使って各拡張子を削除しますcut --delimiter=. --fields=1
  3. sort --unique重複排除、
  4. それらを繰り返し、while read name最後に
  5. 各ファイルが存在するか[[ -e "${name}.ctl" ]] || echo "${name}.ctl" >&2、.outが同じであることを確認してください。

答え4

ファイルを繰り返して、出力ファイルと制御ファイルの推定ファイル名を派生させることができます。完了すると、両方が存在することを確認できます。

for item in *.out *.ctl
do
    base="${item%???}"
    out="$base.out" ctl="$base.ctl"
    [ -f "$out" -a ! -f "$ctl" ] && echo "$out is missing $ctl" >&2
    [ -f "$ctl" -a ! -f "$out" ] && echo "$ctl is missing $out" >&2
done

関連情報