Вы все усложняете гораздо больше, чем нужно. Кажется, вы не хотите рекурсивно обращаться к подкаталогам, поэтому все, что вам нужно, чтобы найти те каталоги, в которых нет определенного файла, это:
for dir in */; do [ ! -e "$dir"/"$filename" ] || printf '%s\n' "$dir"; done
И, чтобы увидеть, у кого из них есть другой файл:
for dir in */; do
[ ! -e "$dir"/"$filename1" ] &&
[ -e "$dir"/"$filename2" ] &&
printf '%s\n' "$dir";
done
Или, в несколько более ясном синтаксисе:
for dir in */; do
if [ ! -e "$dir"/"$filename1" ]; then
if [ -e "$dir"/"$filename2" ]; then
printf '%s\n' "$dir";
fi
fi
done
Все это делается с помощью встроенных -инструментов оболочки. В частности:
[
:this и сопутствующий ]
являются синонимами для test
встроенного (см. help [
или help test
при использовании оболочки в стиле sh -). Это способы написания тестовых операций в оболочке. -e
:это проверяет, существует ли файл/каталог и т.д. См. help test
. Простой формат — :[ -e file ]
, который вернет true, если file
существует. [ ! -e filename ]
:!
просто инвертирует тест. Таким образом, [ ! -e file ]
будет истинным, если file
не существует не . В совокупности это означает, что приведенная выше команда выполняет:
## Iterate over every directory (dirs only because of the '/' in '*/')
## saving each of them in the variable $dir.
for dir in */; do
## If this $dir does not contain $filename1
if [ ! -e "$dir"/"$filename1" ]; then
## If this $dir does contain $filename2
if [ -e "$dir"/"$filename2" ]; then
## Print the directory name
printf '%s\n' "$dir";
fi
fi
done
Чтобы запустить это, конечно, вам нужно сначала установить $filename1
и $filename2
соответственно. Например:
filename1="unwantedFile"
filename2="wantedFile"
Учитывая ситуацию, которую вы продемонстрировали, я бы rm /etc/yum.repos.d/msprod.repo
, так как это дубликат /etc/yum.repos.d/microsoft -prod.repo, а также не принадлежит ни одному пакету.
Чтобы программно определить, принадлежит ли файл пакету, проверьте код возвратаrpm
:
if rpm -qf /the/file > /dev/null 2>&1
then
: the file is owned by an RPM
else
: the file is not owned by an RPM
fi