Переименование специальных символов в именах файлов в подчеркивание

Это описано в исходном репозитории GitHub . Если вы используете homebrew, вам просто нужно ввести $(brew --prefix)/opt/fzf/installи настроить его так, как вам нравится. Сценарий создаст два файла и попросит вас обновить файлы конфигурации оболочки. Для всех других процедур установки (git clone, linux brew,... )посмотритеhttps://github.com/junegunn/fzf

$(brew --prefix)/opt/fzf/install                                                                             ─╯
Downloading bin/fzf...
  - Already exists
  - Checking fzf executable... 0.18.0
Do you want to enable fuzzy auto-completion? ([y]/n) y
Do you want to enable key bindings? ([y]/n) y

Generate /Users/hans/.fzf.bash... OK
Generate /Users/hans/.fzf.zsh... OK

Do you want to update your shell configuration files? ([y]/n) y

Update /Users/hans/.bashrc:
  - [ -f ~/.fzf.bash ] && source ~/.fzf.bash
    + Added

Update /Users/hans/.zshrc:
  - [ -f ~/.fzf.zsh ] && source ~/.fzf.zsh
    + Added

Finished. Restart your shell or reload config file.
   source ~/.bashrc  # bash
   source ~/.zshrc   # zsh

Use uninstall script to remove fzf.

0
20.11.2020, 19:53
2 ответа

Не анализировать Ls . Кажется, это работает хорошо, но в сложных случаях это может не сработать.

С расширением параметров Bash:

for f in *.mp3; do mv -- "$f" "${f//[!0-9a-zA-Z.-]/_}"; done

С переименованием:

rename -- 's/[^0-9a-zA-Z.-]/_/g' *.mp3

Если у вас есть только стандартные инструменты POSIX и предполагается отсутствие символов новой строки в именах файлов,

for f in *.mp3; do 
    mv -- "$f" "$(printf '%s\n' "$f" | sed 's/[^0-9a-zA-Z.-]/_/g')"
done
3
28.04.2021, 23:03

Сzsh:

autoload -Uz zmv # best in ~/.zshrc
zmv '(*).mp3' '${f//[^0-9a-zA-Z_.-]/_}'

В zshдиапазоны основаны на значении кода, поэтому 0-9включает только 0123456789 (, а не 0123456789٠١٢٣٤٥٦٧٨۰۱۲۳۴۵۶۷۸߀߁߂߃߄߅߆߇߈०१२३४५६७८০১২৩৪৫৬৭৮੦੧੨੩੪੫੬੭੮૦૧૨૩૪૫૬૭૮୦୧୨୩୪୫୬୭୮௦௧௨௩௪௫௬௭௮౦౧౨౩౪౫౬౭౮౸౹౺౻౼౽౾೦೧೨೩೪೫೬೭೮൦൧൨൩൪൫൬൭൮෦෧෨෩෪෫෬෭෮๐๑๒๓๔๕๖๗๘໐໑໒໓໔໕໖໗໘༠༡༢༣༤༥༦༧༨༪༫༬༭༮༯༰༱༳၀၁၂၃၄၅၆၇၈႐႑႒႓႔႕႖႗႘፩፪፫፬፭፮፯፰០១២៣៤៥៦៧៨៰៱៲៳៴៵៶៷៸᠐᠑᠒᠓᠔᠕᠖᠗᠘᥆᥇᥈᥉᥊᥋᥌᥍᥎᧐᧑᧒᧓᧔᧕᧖᧗᧘᧚᪀᪁᪂᪃᪄᪅᪆᪇᪈᪐᪑᪒᪓᪔᪕᪖᪗᪘᭐᭑᭒᭓᭔᭕᭖᭗᭘᮰᮱᮲᮳᮴᮵᮶᮷᮸᱀᱁᱂᱃᱄᱅᱆᱇᱈᱐᱑᱒᱓᱔᱕᱖᱗᱘⁰⁴⁵⁶⁷⁸₀₁₂₃₄₅₆₇₈⅐⅑⅒⅓⅔⅕⅖⅗⅘⅙⅚⅛⅜⅝⅞⅟ↅ↉①②③④⑤⑥⑦⑧⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳⑴⑵⑶⑷⑸⑹⑺⑻⑽⑾⑿⒀⒁⒂⒃⒄⒅⒆⒇⒈⒉⒊⒋⒌⒍⒎⒏⒑⒒⒓⒔⒕⒖⒗⒘⒙⒚⒛⓪⓫⓬⓭⓮⓯⓰⓱⓲⓳⓴⓵⓶⓷⓸⓹⓺⓻⓼⓾⓿❶❷❸❹❺❻❼❽❿➀➁➂➃➄➅➆➇➉➊➋➌➍➎➏➐➑➓〇〡〢〣〤〥〦〧〨㉈㉉㉊㉋㉌㉍㉎㉏㉑㉒㉓㉔㉕㉖㉗㉘㉙㉚㉛㉜㉝㉞㉟㊱㊲㊳㊴㊵㊶㊷㊸㊹㊺㊻㊼㊽㊾㊿㋀㋁㋂㋃㋄㋅㋆㋇㋉㋊㋋㍘㍙㍚㍛㍜㍝㍞㍟㍠㍢㍣㍤㍥㍦㍧㍨㍩㍪㍫㍬㍭㍮㍯㍰㏠㏡㏢㏣㏤㏥㏦㏧㏩㏪㏫㏬㏭㏮㏯㏰㏱㏲㏳㏴㏵㏶㏷㏸㏹㏺㏻㏼㏽㏾꘠꘡꘢꘣꘤꘥꘦꘧꘨꣐꣑꣒꣓꣔꣕꣖꣗꣘꤀꤁꤂꤃꤄꤅꤆꤇꤈꧐꧑꧒꧓꧔꧕꧖꧗꧘꧰꧱꧲꧳꧴꧵꧶꧷꧸꩐꩑꩒꩓꩔꩕꩖꩗꩘꯰꯱꯲꯳꯴꯵꯶꯷꯸012345678, как в bashв большинстве современных локалей )и a-zтолькоabcdefghijklmnopqrstuvwxyz(не тысячи символов, которые другие оболочки будут соответствовать ), но это по-прежнему выполняется на посимвольной основе (, в отличие от того, что произошло бы, если бы вы переключились на локаль C в bash, чтобы обойти предыдущую проблему, когда она работать с байтами и разбивать символы на байты, составляющие там кодировку для многобайтовых ).

Он также не блокируется байтами, не образующими допустимых символов в локали (, и эти байты будут соответствовать [^0-9a-zA-Z_.-]), так что, в конце концов, результирующие файлы должны содержать только символы из 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_.-, а не -символ.

В bashвы могли бы сделать что-то похожее с:

accepted_characters='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_.-'
for f in *[^$accepted_characters]*.mp3; do
  mv -i -- "$f" "${f//[^$accepted_characters]/_}"
done

(без гарантийzmv).

0
28.04.2021, 23:03

Теги

Похожие вопросы