Рекурсивно переименовывать файлы [дублировать]

У меня была аналогичная проблема, и я решил ее, переименовав файл /var/log/btmp и создав новый пустой файл /var/log/btmp.

Проблема появляется после нерегулярной перезагрузки. - Putty исчезает после успешного входа в систему - Закрытое соединение WinSCP "Сервер отправил статус выхода команды 254" - Вход из sercon показывает "Последний вход... У вас есть почта. Отказано в доступе"

Перезагрузка в режиме восстановления позволила мне получить доступ к ssh-логам sshd[24017]: ошибка: PAM: pam_open_session(): В доступе отказано

Проблема решена с помощью нового пустого файла /var/log/btmp

1
10.05.2018, 12:59
1 ответ

Сzsh:

autoload zmv # best in ~/.zshrc
zmv '(**/)(* *)' '$1${2// /_}'

Как и в вашем коде, он не переименовывает скрытые файлы. Он также не заглядывает в скрытые каталоги. Если вы хотите переименовать их, измените его на:

autoload zmv # best in ~/.zshrc
zmv '(**/)(* *)(#qD)' '$1${2// /_}'

bashэквивалентно (, но без гарантий, обеспечиваемых zmv, поэтому вы можете добавить опцию -iкmv)последней из них будет:

LC_ALL=C find. -depth -name '* *' -exec bash -c '
  for file do
    base=${file##*/}
    mv -i -- "$file" "${file%/*}${base// /_}"
  done' bash {} +

Нет простого эквивалента первому, так как нельзя комбинировать -prune(, что было бы необходимо, чтобы не спускаться в скрытые каталоги )и -depth. Однако функционально эквивалентный вариант может быть записан как:

LC_ALL=C find. -depth -name '* *' ! -path '*/.*' -exec bash -c '
  for file do
    base=${file##*/}
    mv -i -- "$file" "${file%/*}${base// /_}"
  done' bash {} +

Он спускался в скрытые каталоги, но не переименовывал там файлы.

0
28.01.2020, 00:35

Теги

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