#linux #bash
#linux #bash
Вопрос:
Мне нужна помощь в написании сценария Bash. Я хочу, чтобы он прошел через папку и переименовал все вложенные папки, чтобы заменить ПОСЛЕДНЮЮ запятую на амперсанд.
for dir in /home/john/Documents/TEST/*;
do
# ***This is the part I can't figure out***
done
Скажем, папка '1234 John, James, Jack'
— я хочу, чтобы она стала '1234 John, James amp; Jack'
Комментарии:
1. Обратите внимание, что это был бы более серьезный вопрос, если бы вы показали свои неудачные попытки, поэтому у нас было лучшее представление о том, где именно вы зависли и почему. Это похоже на вопрос «пожалуйста, напишите мой код для меня», на который мы не одобряем.
2. Кстати, ваше описание не совсем соответствует вашим образцам данных — в описании говорится, что вы просто хотите переключить последнюю запятую в амперсанд в соотношении 1: 1, в образцовых данных говорится, что вы хотите заменить его пробелом, за которым следует амперсанд .
3. Повторяющийся целевой объект, используемый для закрытия этого вопроса, кажется неправильным. Я голосую за повторное открытие вопроса.
Ответ №1:
Это подходящая работа для расширения параметров; методы, использующие их для этой и подобных целей, также описаны в BashFAQ #100.
for f in /home/john/Documents/TEST/*,*/; do # final / means we match only directories
f=${f%/} # remove the last /
front=${f%,*} # front is everything before the last comma
back=${f##*,} # back is everything after the last comma
mv -- "$f" "${front}amp;${back}"
done
Смотрите, как это демонстрируется в онлайн-репле по адресу https://ideone.com/XcY4rw
Ответ №2:
for dir in /home/john/Documents/TEST/*,*/;
do
newdir=$(echo "${dir}" | sed 's/(.*),/1amp;/')
mv "${dir}" "${newdir}"
done
Вы можете просто использовать use sed
для замены последней запятой в имени каталога на amp; .
Комментарии:
1. GNU bash, версия 5.0.3, работает отлично.
2. См . ideone.com/Jg3wNf для онлайн-реплика, показывающая проблему. Посмотрите, как он рассматривается
/home/john/Documents/Test/John,
как отдельный аргумент отJames,
orJack/
?3. @CharlesDuffy Мне жаль говорить: это работает отлично. we.tl/t-zROk4hieXr (получите тестовый архив здесь)
4. pastebin.com/q6QJWc41 просто принесите это сюда, это примерно то же самое в конце
5. В вашем
abc,abc,abc
тестовом имени файла нет пробелов. Операция1234 John, James, Jack
выполняется.