Вот то, что происходит:
find
находит каталог соответствия ./Test 02
.find
выполняется rename
команда на том каталоге.rename
переименовывает Test 02
кому: Test_02
.find
попытки убывать в каталог Test 02
. Но это больше не существует.Самый легкий способ решить эту проблему состоит в том, чтобы сказать find
работать наоборот: сначала ищите соответствия в каталоге, затем проверьте, соответствует ли сам каталог. Это что -depth
опция делает.
Если Вы только добавляете -depth
, Вы столкнетесь с другой проблемой, которая является этим когда find
достигает Test 01/Test A
, это вызывает rename 'y/\ /\_/' 'Test 01/Test A'
, который пытается переименовать тот каталог к Test_01/Test_A
. Это перестанет работать, так как нет никакого названного каталога Test_01
. Легкая фиксация должна использовать -execdir
опция, которая вызывает rename
в Test 01
каталог и передачи Test A
как аргумент. Можно ускорить вещи путем передачи нескольких аргументов rename
в одном пакете, при помощи +
вместо ;
завершаться -execdir
команда.
find -depth -name '* *' -type d -execdir rename 'y/ /_/' {} +
С другой стороны, используйте эту короткую, но загадочную команду zsh:
autoload zmv
zmv -Qw '**/*(/D)' '$1${2// /_}'
zmv
функция переименовывает файлы согласно шаблонам. Исходный шаблон **/*
, который соответствует всем файлам (*
) во всех подкаталогах рекурсивно (**/
). Спецификаторы шарика (активированный -Q
опция), указывают, что только каталоги подобраны (/
) и тот точечные файлы включены (D
). -w
опция создает обратную ссылку для каждого подстановочного знака в исходном шаблоне. Замена запускается с $1
который определяет соответствие для первого подстановочного знака (для **
, это включает финал /
), и сопровождается ${2// /_}
, который является $2
(что *
подобранный) измененный для замены всех пробелов _
. Добавьте -v
опция видеть, что делает команда, Вы заметите, что она пересекает глубину сначала как find -depth
.
Свойственная информация об аутентификации
Информация об аутентификации может быть явно указана через [116091]$XAUTHORITY[116092], а по умолчанию [116093]~/. В противном случае [116095]$DISPLAY[116096] и [116097]$XAUTHORITY[116098] будут установлены для вашего пользователя, [116099]sudo[116100] также установит их для новой оболочки, и все должно работать нормально.
Если они не установлены, то, скорее всего, они будут установлены на неправильные значения по умолчанию, и вы не сможете запускать и X приложений.
В Debian [116101]$XAUTHORITY[116102] обычно не установлена явно. Просто добавьте
к вашему [116103].bashrc[116104] или явно скажите [116105]XAUTHORITY=~/.Xauthority sudo ...[116106] и все должно работать.
Вы также можете использовать [116107]xauth list[116108] для проверки наличия правильной аутентификационной информации.[115772].
или
Установить переменную окружения в скрипте входа root'а (один из .bashrc, .profile, .bash_profile ...). экспортировать DISPLAY=:0. 0
Вы можете проверить, установлено ли оно,
Чтобы открыть дисплей для всех пользователей со всех хостов, как ваш обычный пользователь, вы можете сделать это с помощью :
xhost +
rsync -avc -e ssh /path/to/files user@computer:/path/to/files
Я придумал:
find . -type f -size '+2M' -print | while read i
do
echo " " > $i
done
что работает.
-121--205243- С помощью awk
:
awk '{if($0=="click"){getline n;printf "%s(%s)\n", $0, n}else{print}}' file
Если строка соответствует щелкните
, загрузите следующую строку в переменную с именем n
, а затем распечатайте требуемый формат вывода.
Edit:
Если существует переменное количество нескольких строк и требуется объединить их до тех пор, пока не появится пустая строка, используйте следующую команду:
awk '{if($0=="click"){getline n; printf "%s(%s", $0, n;
while($0!=""){printf ",%s", $0; getline};
printf ")\n\n", x}else{print}}' file
Она печатает строки, разделенные запятыми, пока не найдет пустую строку.
-121--133211-У меня был тот же вопрос, что и у вас, но для обычного пользователя. Допустим, я хочу запустить firefox с помощью учетной записи пользователя foo. Я вошел в систему под именем bar:
[bar@localhost ~]$ sudo -u foo -H firefox
К сожалению, эта команда завершилась с той же ошибкой, что и в вопросе (т.е. ни один протокол не указан и не может открыть дисплей)
Моим решением было просто добавить пользователя foo в список авторизованного доступа к серверу X.
xhost si:localuser:foo
И тогда я смог запустить Firefox (и другое приложение X) с помощью sudo
и пользователя foo.
Фон : В окне X имеется архитектура клиент/сервер. При запуске приложения запрашивается разрешение X-сервера на его отображение. По умолчанию, как только вы открываете сеанс (вы графически входите в систему), вам (вашему пользователю), очевидно, разрешено общаться с сервером и отображать приложения. Другие пользователи не имеют этого разрешения, если его не указать. xhost
- это средство для управления списком разрешений. si
указывает на то, что правило является серверным, и уполномочивает локального пользователя foo
отображать приложения. X Window является очень мощным в этом отношении, и вы можете отображать удаленные приложения локально, играя с переменной среды DISPLAY
и xhost
(но не ограничиваясь ими). В более старые времена, когда люди набирали xhost +
и неявно позволяли всем использовать свою X-сессию, можно было отображать приложение на своем экране для приколов; -) не столько сейчас, сколько люди все реже используют X Window клиент/серверную архитектуру (по крайней мере для того, что я наблюдаю за последние 10 лет).
PS: Я сделал это, чтобы запустить Firefox в своего рода "тюрьме" (чтобы избежать уязвимости, как для pdf.js в будущем). Но я быстро выяснил, что вызов Firefox через sudo не позволит ему получить доступ ни к аудио, ни к видеоаппаратуре. Но есть один парень, который ясно объясняет , как активировать аппаратное ускорение видео и аудио при вызове Firefox через sudo . YMMV с этими инструкциями, например, мне все еще отказано в разрешении на аудио, но видео нормально (протестировано на Fedora 22 с SELinux ON).
Учитывая, что вы используете Debian, простое и поддерживаемое решение - организовать sudo
для копирования ваших учетных данных для авторизации X11. pam_xauth
включен в пакет libpam-modules
именно для этой цели; чтобы использовать его, вам просто нужно добавить
session optional pam_xauth.so
в ваш файл /etc/pam.d/sudo
. Вы также можете добавить его в su
. Для получения полной информации, конечно, обратитесь к странице руководства pam_xauth
.
используйте эту команду, и она сработает
sudo cp /home/user/.Xauthority .Xauthority
Что мне помогло:
Вы можете xauth generate :0. trusted
на стороне user
, что создаст новыйMIT-MAGIC-COOKIE-1
Проверьте вновь созданный ключ с помощью xauth list
, так как user
иroot
(они должны быть одинаковыми, если ваша переменная XAUTHORITY
указывает на один и тот же файл.
Вуаля, root
получит доступ к любому приложению X с терминала, но только временно.
Чтобы сделать его постоянным, см. ответ @Huygens!
Альтернативное решение:
Такие службы, как cron, работающие под root, не имеют доступа к отображению, если текущий пользователь x не является root.
Нам просто нужно добавить пользователя root в x, вы можете сделать это во время входа в систему с помощью скрипта запуска
xhost local:root
В целях тестирования мы можем просто запустить команду than под текущим пользователем и перезапустить корневой скрипт/задание/службу/...
В команде sudo
есть переключатель для сохранения переменных среды.
-E, --preserve-env preserve user environment when running command
Так что вы можете запустить команду с переключателем -E. Пример:
sudo -E wireshark
Если вам не нужно запускать критически важные для конфиденциальности приложения, такие как веб-браузеры, лучше добавить переключатель -E с помощью sudo. Мы не можем запустить Chrome или Firefox, просто добавив переключатель-E . Потому что во многих браузерах реализована защита от нарушений пользовательского пространства. Ответ @huygens может иметь представление по этому вопросу.
Примечание:Добавление переключателя -E не поможет, если в среде вашего пользователя НЕ установлены правильноDISPLAY
иXAUTHORITY
.