Ваша команда может найти каталоги (и другие не -обычные файлы ). Каталоги — это не обычные файлы, которые вы можете редактировать с помощью sed
.
Добавление теста -type f
к команде find
гарантирует, что вы обрабатываете только обычные файлы:
find. -type f -not -path \*.hg\* -exec sed -i 's/FCLP1025/FCLP1080/g' {} \;
или, со стандартными опциями find
и более читаемым цитированием,
find. -type f ! -path '*.hg*' -exec sed -i 's/FCLP1025/FCLP1080/g' {} \;
Если вы просто хотите полностью пропустить какой-либо каталог .hg
, используйте -prune
, чтобы удалить его из пути поискаfind
:
find. -name.hg -prune -type f -exec sed -i 's/FCLP1025/FCLP1080/g' {} \;
Это заставляет find
даже не входить в каталоги с именем .hg
. Ваша команда будет входить в такие каталоги и проверять все в них с помощью -path
, что будет немного неэффективно.
Обратите внимание, что не будет вывода вашей команды find
, так какsed -i
(sed
выполнение в -редактировании места )никогда не приводит к выводу на терминал (, если нет диагностических сообщений ). Вывод sed -i
попадает в файлы, которые он редактирует.
Также обратите внимание, что последняя команда find
выше попытается отредактировать каждый файл. Если вы что-то знаете об именах файлов, которые хотите отредактировать,вы можете добавить -name 'some pattern'
непосредственно перед -exec
, чтобы ограничить запуск sed
только этими файлами.
Ваше понимание неверно. :Псевдо -TTY считается полностью эквивалентным «настоящему» TTY.
Когда tty
печатает /dev/pts/0
, это означает, что сеанс имеет действительный TTY.
Но если вы подключитесь к ВМ с настройками SSH по умолчанию и укажете команду для запуска, ситуация будет другой:
$ ssh VM-user@VM-hostname "hostname; tty"
VM-hostname
not a tty
и , что — это ситуация, отвергнутая опцией sudo
requiretty
.
Требование наличия TTY позволяет SSH отклонять попытки передать ответ на запрос пароля через стандартный ввод, как это делают многие другие программы Unix при запросе пароля.
Это также позволяет вам делать подобные вещи:
sudo -u some-user data_producing_command 2> error-log-file | data_consuming_command
без запроса пароля, который не смешивается ни с данными, переданными в data_consuming_command
, ни с error-log-file
. (Обратите внимание, что data_consuming_command
здесь запускается от вашего имени, а не от some-user
!)
Другими словами, с установленным requiretty
вы не можете использовать sudo
в таких контекстах, как:
ssh VM-user@VM-host sudo something
завершится ошибкой, а ssh -tt VM-user@VM-host sudo something
завершится успешно. at
или batch
nohup
cgi-bin
или любой другой демонизированный процесс, который не имеет отношения к сеансам пользователя Когда requiretty
установлен и sudo
запрашивает пароль, он делает это примерно так же, как в этом фрагменте скрипта:
printf "[sudo] password for $USER: " > /dev/tty # display prompt
TTYSETTINGS=$(stty -F /dev/tty --save) # save current TTY settings
stty -F /dev/tty -echo -echoe # prevent displaying the password
read PASSWORD < /dev/tty
stty -F /dev/tty $TTYSETTINGS # restore TTY settings
# now check if $PASSWORD is correct...
/dev/tty
— это «волшебное» устройство, которое всегда будет действовать как псевдоним фактического устройства TTY сеанса, если сеанс имеет TTY. Он существует именно для таких вещей :, чтобы позволить любому сценарию или программе «избежать» конвейера или другого перенаправления ввода/вывода и взаимодействовать непосредственно с пользователем, когда это необходимо.
Если requiretty
установлен, а /dev/tty
не используется (, т. е. когда с процессом не связан реальный TTY ),это рассматривается так же, как ошибка аутентификации пароля.