特定のファイルを含むサブディレクトリを検索して検索する必要がありますが、この特定のファイルと他のファイルが含まれている場合はリストに表示したくありません。
ステートメントは次のとおりです。
- "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
答え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