Для выявления пакетов, вызывающих конфликты (или другие проблемы )во время обновления пакета, я считаю, что наиболее полезным подходом является включение режима отладки распознавателя :
.apt -o Debug::pkgProblemResolver=yes upgrade
Это покажет вам все проблемы, с которыми сталкивается распознаватель, а также пакеты, которые заставили его рассмотреть проблемные зависимости.
Эта команда:
for f in "`find /sdcard/Download/tordownloadbackup/ -type f |...
выглядит неуклюже и подвержено ошибкам. На самом деле очень не рекомендуется перебирать напечатанный список файлов с помощью for
.
Самый надежный способ перебора файлов, найденных с помощью find
в bash, — это использовать read
и строки с завершающим нулем. Используйте < <(command)
после while
для передачи вывода команды в read
, это называется подстановкой процесса .
while IFS= read -r -d $'\0' file; do
# Arbitrary operations on "$file" here
done < <(find /some/path -type f -print0)
Спасибо за старый ответ @SiegeX здесь:https://stackoverflow.com/questions/8677546/reading-null-delimited-strings-through-a-bash-loop
Кроме того, rev |cut -c 6-100| cut -d / -f 1 |rev
выглядит странно. Я думаю, что это должно напечатать базовое имя каталога. Используйте для этого либо встроенную в bash -манипуляцию со строками, либо dirname
и basename
.
Таким образом, вы можете в конечном итоге переписать этот цикл в (с манипуляциями со строками, быстрее, потому что встроенный -в):
while IFS= read -r -d $'\0' file; do
Filebasename="${file##*/}"
Dirname="${file%/*}"
Dirbasename="${Dirname##*/}"
# other stuff here
done < <(find /sdcard/Download/tordownloadbackup/ -type f -print0)
Дополнительные сведения об удалении подстроки см. в Проекте документации по Linux .
Или используйте basename
иdirname
(медленнее, потому что внешние программы):
while IFS= read -r -d $'\0' file; do
Dirbasename="$(basename -- "$(dirname -- "$file")")"
# other stuff here
done < <(find /sdcard/Download/tordownloadbackup/ -type f -print0)