特定のファイルを含むサブディレクトリを検索して検索する必要がありますが、この特定のファイルと他のファイルが含まれている場合はリストに表示したくありません。
ステートメントは次のとおりです。
- "password.old"ファイルを含むディレクトリを見つけます。
- ディレクトリに「password.old」と「webvirtual」が含まれている場合は、リストしないでください。
- ディレクトリに「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'
-execdir
GNU find
(4.2.12(2005)ベース)sfind
とほとんどのBSD(派生)に存在します。-printf
GNU専用です。-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