ディレクトリ(/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ファイルなので、両方の方法を確認する必要があります。これを行う簡単な方法(ファイル名にスペースを含む特殊文字がなく、ドットのみが含まれている場合)は次のとおりです。
- 以下を含むすべての
find . -type f
ファイルを検索します。 - 、を使って各拡張子を削除します
cut --delimiter=. --fields=1
。 sort --unique
重複排除、- それらを繰り返し、
while read name
最後に - 各ファイルが存在するか
[[ -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