「if」および「and」文で「検索」コマンドを使用する

「if」および「and」文で「検索」コマンドを使用する

特定のファイルを含むサブディレクトリを検索して検索する必要がありますが、この特定のファイルと他のファイルが含まれている場合はリストに表示したくありません。

ステートメントは次のとおりです。

  1. "password.old"ファイルを含むディレクトリを見つけます。
  2. ディレクトリに「password.old」と「webvirtual」が含まれている場合は、リストしないでください。
  3. ディレクトリに「webvirtual」がなく、「password.old」のみが含まれている場合は、ディレクトリパスを> OLD.TXTファイルに出力します。

これが私が現在持っているものにすべて問題があるのでしょうか?うまくいくようですが、私は初めてbashスクリプトに触れ、何も欠けていないことを確認したかったのです。それともこの問題を処理するより良い方法がありますか?

#!/bin/sh
if FILE=$(find ./ -path OLD/ -prune -o -name "password.old") && FILE=$(find ./ -path OLD/ -prune -o -name "webvirtual*")
then
printf %"s\n" $FILE > Not_Old_Ones.txt
fi
if FILE=$(find ./ -path OLD/ -prune -o -name "password.old") && FILE=$(find ./ -path OLD/ -prune -o ! -name "webvirtual*")
then
printf %"s\n" $FILE > Old_Ones.txt
fi

ベストアンサー1

私はそれをします:

find . -path ./OLD -prune -o -name password.old \
  ! -execdir [ -e webvirtual ] \; -printf '%h\n'

-execdirGNU find(4.2.12(2005)ベース)sfindとほとんどのBSD(派生)に存在します。-printfGNU専用です。-execdir pwd \;他のfind実装に置き換えることができます。

-execdir利用できない場合:

find . -path ./OLD -prune -o -name password.old -exec sh -c '
  for file do
    dir=${file%/*}
    [ -e "$dir/webvirtual" ] || printf "%s\n" "$dir"
  done' sh {} +

上記はPOSIXです。 Solaris 10以下では、標準の代わりにsh標準を使用する必要があります。/usr/xpg4/bin/bin

おすすめ記事