Если необходимо переименовать файлы в подкаталогах также и Вашем find
поддержки -execdir
предикат, затем можно сделать
find /search/path -depth -name '* *' \
-execdir bash -c 'mv -- "$1" "${1// /_}"' bash {} \;
Благодарите @glenn jackman для предложения -depth
опция для find
и заставить меня думать.
Обратите внимание на это в некоторых системах (включая GNU/Linux), find
может не найти файлы, имя которых содержит пробелы и также последовательности байтов, которые не формируют допустимые символы (типичный с медиа-файлами с именами с символами неASCII, закодированными в наборе символов, отличающемся от локали). Установка локали к C
(как в LC_ALL=C find...
) решил бы проблему.
Gilles определил Вашу основную проблему, но я хотел попытаться объяснить это по-другому.
Bash интерпретирует специальные быстрые Escape только прежде, чем развернуть любые переменные в подсказке. Это означает то использование \e
в переменной, которая расширена от подсказки, не работает, даже при том, что она действительно работает непосредственно в PS1
.
Например, это работает как ожидалось и дает красный текст:
PS1='\e[1;31m this is in red '
Но это не делает, это просто помещает литерал \e
в подсказке:
RED='\e[1;31m'
PS1="$RED not in red "
Если Вы хотите сохранить цветные Escape в переменных, можно использовать ANSI-C, заключающий в кавычки ($'...'
) помещать литеральный символ ESC в переменную.
Чтобы сделать это, можно изменить определение GREEN
, RED
, и NONE
, таким образом, их значение является фактической escape-последовательностью.
GREEN=$'\033[1;32m'
RED=$'\033[1;31m'
NONE=$'\033[m'
Если Вы делаете это, Ваше первое PS1
с одинарными кавычками должен работать:
PS1='${RED}\h $(get_path) ${exitStatus}${NONE} '
Однако затем у Вас будет вторая проблема.
Попытайтесь выполнить это, затем нажмите Up Arrow, затем Домой, и Ваш курсор не вернется к запуску строки.
Зафиксировать это, изменение PS1
включать \[
и \]
вокруг цветных escape-последовательностей, например.
PS1='\[${RED}\]\h $(get_path) $?\[${NONE}\] '
Вы не можете использовать get_exit_status
правильно здесь, так как его вывод содержит обе печати (код выхода) и непечатаемые символы (цветовые коды), и нет никакого способа отметить его правильно в подсказке. Помещение \[...\]
отметил бы его как непечатаемый полностью, который не корректен. Необходимо будет изменить функцию так, чтобы она только распечатала надлежащий цветовой код, и затем окружите ее \[...\]
в подсказке.
Когда Вы работаете PS1='${RED}\h $(get_path) ${exitStatus}${NONE} '
, PS1
переменная установлена на ${RED}\h $(get_path) ${exitStatus}${NONE}
, где только \h
быстрая escape-последовательность. После того, как быстрые последовательности расширены (получение ${RED}darkstar $(get_path) ${exitStatus}${NONE}
), оболочка выполняет обычные расширения, такие как переменные расширения. Вы получаете отображенную подсказку, которая похожа \e[1;31mdarkstar PATH 0\e[m
. Ничто по пути не расширяется \e
последовательности к фактическим символам ESC.
Когда Вы работаете PS1="${RED}\h $(get_path) ${exitStatus}${NONE} "
, PS1
переменная установлена на \e[1;31m\h PATH 0\e[m
. Переменные RED
, exitStatus
и NONE
расширены во время присвоения. Затем подсказка содержит три быстрых escape-последовательности (\e
, \h
, и \e
снова). Нет никаких переменных оболочки для расширения на данном этапе.
Для наблюдения цветов Вам нужны цветные переменные для содержания фактических символов ESC. Можно сделать это этот путь:
RED=$'\033[1;31m'
NONE=$'\033[m'
PS1='\[${RED}\]\h \w $?\[${NONE}\] '
$'…'
разворачивает восьмеричные обратной косой чертой последовательности и некоторые последовательности буквы обратной косой черты такой как \n
, но не включая \e
. Я внес три других изменения в Вашу подсказку:
\[…\]
вокруг непечатаемых последовательностей, таких как изменяющие цвет команды. Иначе Ваш дисплей закончится искаженный, потому что удар не может выяснить ширину подсказки.\w
встроенная escape-последовательность должна распечатать текущий каталог.$?
в подсказке, если у Вас нет a PROMPT_COMMAND
во-первых.PS1
является неправильным, но совет использовать $'...'
для RED
и GREEN
должен заставить его работать с помощью dogbane's PS1
. гибкость
– Mikel
03.03.2011, 04:05
Попытка:
PS1='`exitStatus=$?;if [ $exitStatus -eq 0 ];then echo "\['${GREEN}'\]";else echo "\['${RED}'\]";fi;echo "\h $(get_path) ${exitStatus}${NONE}"`'
Здесь Вы идете - Это Работы Для Me(TM) в Ubuntu и других Linux (Linuxen?).
Причина того, чтобы вставить обнаружение кода выхода $PS1
тот один хост, имеет только для чтения $PROMPT_COMMAND
набор прежде .bashrc читается.
Вот подход, с которым я пошел, он избегает использования PROMPT_COMMAND
.
# This function is called from a subshell in $PS1,
# to provide a colourised visual indicator of the exit status of the last run command
__COLOURISE_EXIT_STATUS() {
# uncomment the next line for exit code output after each command, useful for debugging and testing
#printf -- "\nexit code: $1\n" >&2
[[ 0 == "$1" || 130 == "$1" ]] && printf -- "$GREEN" || printf -- "$RED"
}
Затем мой $PS1
следующие:
PS1='# ${debian_chroot:+($debian_chroot)}'"${GREEN}\u${YELLOW}@${DARK_YELLOW}\h${WHITE}:${LIGHT_BLUE}\w${WHITE}\n"'\[$(__COLOURISE_EXIT_STATUS $?)\]# \$'"\[${WHITE}\] "
$?
может иметь целое число, действительно необходимо использовать printf '%b' "$GREEN"
вместо этого. Кроме того, избегайте использования имен функций, снабженных префиксом __
или _
поскольку они используются завершением удара.
– nyuszika7h
12.06.2014, 20:18
Для PROMPT_COMMAND
чище определить функцию и использовать:
prompt_command() {
# ...
}
PROMPT_COMMAND=prompt_command
\[
\1
, и\[
\2
. Те, которые к, соответствуют некоторому readline'sRL_PROMPT_{START,END}_IGNORE
вещь, которая просит, чтобы это проигнорировало байты при подсчете быстрой длины на экран. См. lists.gnu.org/archive/html/bug-bash/2015-08/msg00027.html. – Arthur2e5 27.10.2015, 20:53\]
\2
? И Вы имеете в виду вот почему, что это необходимо для${exitStatus}
? Моя точка была этим${exitStatus}
не содержит непечатаемые символы, таким образом, удар должен смочь правильно определить, сколько символов он перемещает подсказку без\[
и\]
в\[${exitStatus}\]
. – Mikel 27.10.2015, 21:13