Вы можете использовать find -exec...
для замены в однострочном -сценарии оболочки.
find. -name "*.mp3" -type f -exec bash -c 'mv "$1" "${1/pronunciation_de_}"' bash {} \;
Имя файла {}
передается в качестве параметра $1
выполняемому процессу bash, и ${1/pronunciation_de_}
использует возможности расширения параметров bash и заменяет первое вхождение pronunciation_de_
в $1
с пустой строкой.
Дополнительный параметр -type f
обеспечивает соответствие только обычным файлам.
как сказал Кусалананда, noglob
это путь; вы можете определить свою функцию как есть, а затем использовать alias
, чтобы включитьnoglob
:
downloadyoutube(){
youtube-dl -f 'bestvideo[ext=mp4]+bestaudio[ext=m4a]/best[ext=mp4]/best' "$1"
}
alias downloadyoutube="noglob downloadyoutube"
В любом случае, то, что вы пытаетесь сделать с этими аргументами, спорно:youtube-dl
по умолчанию уже много лет; читать текущую man
страницу!
Я хотел бы подчеркнуть, что Кусалананда прав:
'
, не только "
, здесь, чтобы вы не хотели, чтобы несколько специальных символов стали проблемами,&
, вам лучше просто настроить свою оболочку для автоматической замены вставленного &
в строке (не в конце строки )на \&
; мой zsh делает это автоматически, и я думаю, что в этом виноват -мой -zsh. Вероятно, у вас возникла проблема, о которой вы на самом деле не упомянули: оболочка zsh
по умолчанию выдает ошибку, если шаблон подстановки имени файла не соответствует ни одному имени:
$ downloadyoutube https://www.youtube.com/watch?v=_OBlgSz8sSM
zsh: no matches found: https://www.youtube.com/watch?v=_OBlgSz8sSM
URL здесь содержит символ ?
, который является подстановочным символом. Это побуждает оболочку выполнить подстановку имени файла, используя URL-адрес в качестве шаблона. Совпадение не найдено, поэтому оболочка жалуется и даже не пытается вызвать вашу функцию.
Аналогичное поведение наблюдается в оболочке bash
, если установлен параметр оболочки failglob
:
$ shopt -s failglob
$ downloadyoutube https://www.youtube.com/watch?v=_OBlgSz8sSM
bash: no match: https://www.youtube.com/watch?v=_OBlgSz8sSM
Вы можете запретить оболочке использовать URL-адрес в качестве шаблона подстановки, установив параметр оболочки NOGLOB
с помощью setopt NOGLOB
. Это отключает подстановку в текущем сеансе оболочки, пока вы не используете unsetopt NOGLOB
.
Вы также можете добавить к вызову функции префикс noglob
, что приведет к установке параметра оболочки NOGLOB
для одной команды:
noglob downloadyoutube https://www.youtube.com/watch?v=_OBlgSz8sSM
Тем не менее, наиболее разумный подход заключается в заключении URL-адреса в одинарные кавычки при вызове функции. URL-адреса вполне могут содержать другие символы, которые являются специальными для оболочки и которые не являются не подстановочными символами, например, &
, что вводит фоновое задание. URL-адрес с &
в нем нельзя было бы использовать без кавычек, даже если универсализация имени файла отключена.
Отключение подстановки также не отключает раскрытие фигурных скобок({...}
)или подоболочки ((...)
), которые потенциально могут случайно появиться в URL-адресах.