Это зависит от того, как Вы устанавливаете пакет или обновление.
Если Вы - a RedHat Satellite
клиент там является журналом в /var/log/rhsm
названный rhsm.log
но это будет все еще использовать средство для установки обычно yum
yum
Существует a yum.log
в /var/log/
rpm
не поддерживает журналы, однако можно работать rpm -qa --last
видеть список пакетов, которые были установлены и когда, но не перечисляет отказы.
Единственный способ видеть отказы был бы в командной строке.
Вы смогли устанавливать проблемы путем взгляда на history
но это является субъективным и трудоемким. Необходимо было бы искать history
и подойдите установки или обновления установленных пакетов. Это также не покрывает, если что-то было установлено или обновлено с помощью других методов, которые не были выполнены в командной строке.
Puppet
имеет платформу, которую это использует для выполнения package
установки. Это имеет список приблизительно 33 различных поставщиков для всей ОС. Это будет искать способность установить убывающим способом, обычно принимающим значение по умолчанию к yum
и отступание к rpm
.
Поскольку типичный синтаксис для puppet
установки пакета
package { ssh;
ensure => present
}
Марионеточная платформа определяет после этого на основе Ваших предпочтений репозитория и costs
связанный с установочным носителем, чтобы использовать затем, что использовать для установки его.
И у Вас всегда есть типичная нейтрализация /var/log/messages
Вы будете иногда видеть ошибки там в зависимости от того, с чем был связан отказ.
Также, если пакет собирался добавить модуль или что-нибудь это dmesg
распознал бы и отступился, Вы могли бы видеть информацию в dmesg
До незаконченный, необходимо было бы проверить ps
для этого. Или доступный tty's
и pty's
Perl идет с a rename(1)
команда, которая установлена в большинстве систем Linux. В находящихся в Debian системах это находится в /usr/bin
и для этого случая, Вы использовали бы его как это:
$ rename 's/tmp$/temp/' /home/*/tmp
Первым аргументом является выражение жемчуга, которое действует на последующие аргументы, генерирующие новое имя. Каждый затем переименован согласно результату того выражения.
Если корневому каталогу уже назвали файл/каталог temp
, Вы просто получите ошибку для того каталога и rename
продолжится:
/home/c/tmp not renamed: /home/c/temp already exists
Можно выполнить его сначала с -n
флаг для наблюдения, что переименовывает, обошелся бы без фактического выполнения его и удостоверился бы, что все это выглядит правильным. Затем отбросьте -n
и позвольте ему сделать свое задание.
sudo find /home -maxdepth 2 -type d -name 'tmp' -execdir mv {} temp \;
Здесь, maxdepth
гарантирует, чтобы Вы посмотрели только до двух уровней из текущего каталога. И, execdir
указывает, что последующая команда будет выполняться путем изменения на местоположение, где найденный файл.
tmp
. Вы могли бы хотеть добавить -type d
.
– Joseph R.
23.08.2013, 21:12
-execdir
работы для GNU find
только.
– Joseph R.
23.08.2013, 21:17
-execdir
относительно недавнее дополнение к GNU, находят (2005). Это прибывает из BSDs (1996 в OpenBSD)
– Stéphane Chazelas
23.08.2013, 23:41
Единственным путем я могу думать для сокращения второй опции в Вашем вопросе:
for dir in /home/*;do
[ -d $dir/tmp ] && mv -n $dir/t{,e}mp
done
но это покончило с удобочитаемостью несколько. Отметьте это t{,e}mp
расширен оболочкой в эти два слова tmp
и temp
. Таким образом, командная строка была бы расширена до mv <contents of $dir>/tmp <contents of $dir>/temp
. В целом оболочка расширяется prefix_{a,b,c}_suffix
кому: prefix_a_suffix prefix_b_suffix prefix_c_suffix
. Пустое положение, такое как первое в {,e}
расширен в пустую строку.
Можно также сделать что-то похожее с perl
:
perl -e '
@a=grep {-d} glob "/home/*/tmp";
map { rename $_ => $_=~ s/tmp\Z/temp" } @a
'
но я все еще поддерживаю, что Ваша исходная версия была достаточно хороша.
Править
Добавленный -n
переключатель к mv
гарантировать это не ударит $dir/temp
если это существует, как отмечено в комментарии Michael Kjörling к вопросу. Версия Perl ударит temp
если это существует.
t{,e}mp
? Joseph R. Thanks
– Radu Rădeanu
23.08.2013, 21:13
Если Ваша система имеет команду getent и a mv
это принимает a -T
опция, Вы могли сделать:
getent passwd |
while IFS=: read -r x x uid x x home x; do
[ "$home" = / ] ||
[ "$home" = /var ] ||
[ "$uid" -lt 500 ] ||
[ ! -d "$home/tmp" ] ||
find "$home/tmp" -prune -user "$uid" -exec sh -xc '
mv -T -- "$1" "${1%/*}/temp"' sh {} \;
done
Таким образом, мы перечисляем пользовательскую базу данных для получения uid и корневого каталога. Мы исключаем тех пользователей, которые имеют /
или /var
как их корневые каталоги (поскольку мы не хотим переименовывать /tmp
и /var/tmp
) и пользователи, uid которых ниже 500 (как в большинстве систем, это - пользователи системы).
Затем мы только рассматриваем $home/tmp
если его владелец является рассматриваемым пользователем (снова, чтобы не перемещать неправильный файл/dir).
-T
опция, как найдено в GNU mv состоит в том в случае, если $home/temp
уже существовал, чтобы не перемещаться tmp
в нем.
Обратите внимание что любой отказ mv
генерирует сообщение об ошибке, но статус выхода отказа будет потерян.
Произведите операторы перемещения и оцените их в одном выстреле:
ls -d /home/*/tmp | sed 's/.*t/mv &mp &e/' | sh -xv
mv &mp &emp
в Вашем sed
команда. Также не анализируйте вывод ls.
– Joseph R.
24.08.2013, 01:32
Если Вы просто ищете более компактную версию Вашего для цикла, можно сделать это немного более компактный как так:
$ for dir in /home/*/tmp; do [ -d $dir ] && mv $dir ${dir/%tmp/temp/};done
Это будет использовать удары globbing средство для нахождения всех каталогов и файлов, которые соответствуют регулярному выражению /home/*/tmp
. Это затем тестирует, чтобы видеть, является ли это каталогом или нет, если это - каталог, затем переместите его. Последний бит ${dir/%tmp/temp/}
делает поиск и замену на содержании переменной $dir
и замены tmp
с temp
. Этот поиск и замена сделаны только однажды справа налево, таким образом защитив что-либо вне tmp
каталог.
Скажите, что у меня есть эта поддельная структура каталогов:
$ tree -p
.
`-- [drwxrwxr-x] home
|-- [drwxrwxr-x] sam1
| `-- [drwxrwxr-x] tmp
|-- [drwxrwxr-x] sam2
| `-- [drwxrwxr-x] tmp
|-- [drwxrwxr-x] sam3
| `-- [drwxrwxr-x] tmp
`-- [drwxrwxr-x] sam4
`-- [-rw-rw-r--] tmp
Теперь, если мы используем измененную версию нашей команды сверху, которая просто отзывается эхом mv
управляйте, а не выполненный это мы видим то, что это собирается сделать:
$ for dir in home/*/tmp; do [ -d $dir ] && echo "mv $dir ${dir/%tmp/temp/}";done
mv home/sam1/tmp home/sam1/temp/
mv home/sam2/tmp home/sam2/temp/
mv home/sam3/tmp home/sam3/temp/
Примечание: Начало /
намеренно не там так, чтобы я мог запустить этот тест из демонстрационного каталога, который я устанавливаю.
Вы могли также включить в список справку команды rename
вместо mv
. Это изменяет пример немного:
$ for dir in /home/*/tmp; do [ -d $dir ] && rename $dir ${dir/%tmp/temp/};done
tmp
в нем?
– Joseph R.
24.08.2013, 00:37
[ ! -d $dir ] || mv
кому: [ -d $dir ] && mv
?
– Joseph R.
24.08.2013, 00:43
t{,e}mp
. Я никогда не могу помнить использовать то сокращение.
– slm♦
24.08.2013, 01:01