несколько репозиториев yum с name=packages-microsoft-com-prod

Вы все усложняете гораздо больше, чем нужно. Кажется, вы не хотите рекурсивно обращаться к подкаталогам, поэтому все, что вам нужно, чтобы найти те каталоги, в которых нет определенного файла, это:

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"
0
31.05.2019, 22:57
1 ответ

Учитывая ситуацию, которую вы продемонстрировали, я бы 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
2
28.01.2020, 02:30

Теги

Похожие вопросы