「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

答え2

わずかに長いが-execdir使用できない場合に機能する実行可能なソリューションは次のとおりです。

$ tree
.
├── dir_one
│   ├── password.old
│   └── webvirtual
└── dir_two
    └── password.old
$ find . -iname "*password.old" -exec dirname "{}" \; 2>/dev/null | while IFS= read -r directory; do
> [ -e "$directory"/webvirtual ] && continue || echo "$directory"
> done
./dir_two

したがって、今やるべきことは、> OLD.txtステートメントの最後にdoneファイルにリダイレクト出力を追加することです。

このdirnameコマンドを使用できない場合は、次のスクリプトを使用してディレクトリを引数として渡すことができます。

#!/bin/sh

find "$1" -type f -iname "*password.old"  -printf "%h\n" |
while IFS= read -r directory;
do
    [ -e "$directory"/webvirtual ] && continue || echo "$directory"
done

たとえば、

$ ./find_missing_webvirtual.sh ./TESTDIR/                                                                                
./TESTDIR/dir_two

関連情報