Как переименовать каталог от всех учетных записей пользователей

Это зависит от того, как Вы устанавливаете пакет или обновление.

Если Вы - 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

1
23.08.2013, 20:44
6 ответов

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 и позвольте ему сделать свое задание.

4
27.01.2020, 23:11
  • 1
    Следите: унесенный. Еще раз, Perl к спасательному :) –  Joseph R. 24.08.2013, 01:35
sudo find /home -maxdepth 2 -type d -name 'tmp' -execdir mv {} temp \;

Здесь, maxdepth гарантирует, чтобы Вы посмотрели только до двух уровней из текущего каталога. И, execdir указывает, что последующая команда будет выполняться путем изменения на местоположение, где найденный файл.

Источник: https://stackoverflow.com/a/15007149/147021

3
27.01.2020, 23:11
  • 1
    Это также переименовало бы названные файлы tmp. Вы могли бы хотеть добавить -type d. –  Joseph R. 23.08.2013, 21:12
  • 2
    , все снова и снова! Просто забыл при тестировании обновленного Ответа :) –  Barun 23.08.2013, 21:13
  • 3
    Еще одна вещь отметить состоит в том, что, согласно ссылке Вы процитировали, -execdir работы для GNU find только. –  Joseph R. 23.08.2013, 21:17
  • 4
    я проверил бы файл/etc/passwd на homedir. реального пользователя/, размещает, возможно, стандарт, но этот сценарий woudn't работа для пользовательских директоров дома, которые организованы в подпапки или что-то подобное. –  Bonsi Scott 23.08.2013, 22:41
  • 5
    @JosephR. -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 если это существует.

3
27.01.2020, 23:11
  • 1
    Хорошо, это короче, я дам Вам +1. Но можете Вы объяснять что средства t{,e}mp? Joseph R. Thanks –  Radu Rădeanu 23.08.2013, 21:13
  • 2
    @RaduRădeanu. –  Joseph R. 23.08.2013, 21:16

Если Ваша система имеет команду 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 генерирует сообщение об ошибке, но статус выхода отказа будет потерян.

1
27.01.2020, 23:11
  • 1
    Для Не критики (характерной) безжалостной силы, там, но я полагаю, что намерение OP уже состояло в том, чтобы сократить их (очень короткий) цикл. :) –  Joseph R. 24.08.2013, 00:41
  • 2
    @JosephR. - да мы всегда изучаем что-то новое каждый раз, когда он отправляет Согласованное решение 8-) –  slm♦ 24.08.2013, 01:06
  • 3
    @slm. Вышеупомянутый отрывок определенно "готов к прайм-тайму", и я действительно узнавал о по крайней мере 3 новых вещах из него. Я просто думаю, что это - вероятно, излишество в данном случае. –  Joseph R. 24.08.2013, 01:11

Произведите операторы перемещения и оцените их в одном выстреле:

ls -d /home/*/tmp | sed 's/.*t/mv &mp &e/' | sh -xv
1
27.01.2020, 23:11

Если Вы просто ищете более компактную версию Вашего для цикла, можно сделать это немного более компактный как так:

$ 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/

Примечание: Начало / намеренно не там так, чтобы я мог запустить этот тест из демонстрационного каталога, который я устанавливаю.

переименуйте вместо mv

Вы могли также включить в список справку команды rename вместо mv. Это изменяет пример немного:

 $ for dir in /home/*/tmp; do [ -d $dir ] && rename $dir ${dir/%tmp/temp/};done
1
27.01.2020, 23:11
  • 1
    Что, если один из корневых каталогов пользователя имел буквы tmp в нем? –  Joseph R. 24.08.2013, 00:37
  • 2
    @JosephR. - хм... Я могу изменить regex так, чтобы он заменил/tmp/вместо этого.Спасибо! –  slm♦ 24.08.2013, 00:39
  • 3
    вопрос: есть ли определенная причина, которую Вы предпочитаете [ ! -d $dir ] || mv кому: [ -d $dir ] && mv? –  Joseph R. 24.08.2013, 00:43
  • 4
    @JosephR. - нет, просто путь я думал об этом. Если не dir затем пропускает его. Я склонен думать тот путь по некоторым причинам. Мне обычно нравится кодировать к вещи, которую я исключаю, а не вещь, которую я ищу. Не уверенный, если это - дурная привычка или что, просто что-то я заметил, что делаю. Я думаю, что Вы сделали меня более внимательным, что я делаю его 8-). Это могло бы быть, потому что при выполнении работы оболочки, Вы часто - времена, пытаясь удалить хлам от одного канала до следующего. –  slm♦ 24.08.2013, 00:47
  • 5
    @JosephR. - Это - совместимое любое время, Вы делаете что-то то же как он 8-). BTW мне понравилось Ваше использование t{,e}mp. Я никогда не могу помнить использовать то сокращение. –  slm♦ 24.08.2013, 01:01

Теги

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