Пакетное переименование URL-адреса с кодированным именем файла и путем к папке

#linux #bash #macos #cygwin

#linux #bash #macos #cygwin

Вопрос:

У меня есть несколько загруженных файлов, и, к сожалению, инструмент использует кодировку URL в пути к файлу. Как я могу это исправить?

Несколько путей:

 /tmp/site/test/m=plusone
/tmp/site/test/m=plusone/rt=j
/tmp/site/test/m=plusone/rt=j/sv=1/35.jpg?_=15099203492
/tmp/site/test/m=plusone/rt=j/sv=1/d=1
/tmp/site/test/m=plusone/rt=j/sv=1/d=1/ed=1
/tmp/site/test/m=plusone/rt=j/sv=1/d=1/ed=1/am=wQ
/tmp/site/test/m=plusone/rt=j/sv=1/d=1/ed=1/am=wQ/rs=AGLTcCOhuNhUv0siK0B4I8EcahYmZPyCaA/cb=gapi.loaded_0
/tmp/site/_/scs/apps-mozaic/_/js/k=oz.gapi.en_US.e1PemSdvnM4.O/m=plusone
/tmp/site/_/scs/apps-mozaic/_/js/k=oz.gapi.en_US.e1PemSdvnM4.O/m=plusone/rt=j
/tmp/site/_/scs/apps-mozaic/_/js/k=oz.gapi.en_US.e1PemSdvnM4.O/m=plusone/rt=j/sv=1
/tmp/site/_/scs/apps-mozaic/_/js/k=oz.gapi.en_US.e1PemSdvnM4.O/m=plusone/rt=j/sv=1/d=1
/tmp/site/_/scs/apps-mozaic/_/js/k=oz.gapi.en_US.e1PemSdvnM4.O/m=plusone/rt=j/sv=1/d=1/ed=1
/tmp/site/_/scs/apps-mozaic/_/js/k=oz.gapi.en_US.e1PemSdvnM4.O/m=plusone/rt=j/sv=1/d=1/ed=1/am=wQ
/tmp/site/_/scs/apps-mozaic/_/js/k=oz.gapi.en_US.e1PemSdvnM4.O/m=plusone/rt=j/sv=1/d=1/ed=1/am=wQ/rs=AGLTcCOhuNhUv0siK0B4I8EcahYmZPyCaA/cb=gapi.loaded
/tmp/site/_/scs/apps-mozaic/_/js/k=oz.gapi.en_US.gzO-5OVAi4o.O/m=plusone
/tmp/site/_/scs/apps-mozaic/_/js/k=oz.gapi.en_US.gzO-5OVAi4o.O/m=plusone/rt=j
/tmp/site/_/scs/apps-mozaic/_/js/k=oz.gapi.en_US.gzO-5OVAi4o.O/m=plusone/rt=j/sv=1
/tmp/site/_/scs/apps-mozaic/_/js/k=oz.gapi.en_US.gzO-5OVAi4o.O/m=plusone/rt=j/sv=1/d=1
/tmp/site/_/scs/apps-mozaic/_/js/k=oz.gapi.en_US.gzO-5OVAi4o.O/m=plusone/rt=j/sv=1/d=1/ed=1
/tmp/site/_/scs/apps-mozaic/_/js/k=oz.gapi.en_US.gzO-5OVAi4o.O/m=plusone/rt=j/sv=1/d=1/ed=1/am=wQ
/tmp/site/_/scs/apps-mozaic/_/js/k=oz.gapi.en_US.gzO-5OVAi4o.O/m=plusone/rt=j/sv=1/d=1/ed=1/am=wQ/rs=AGLTcCN8zpbBBFew5eMDpwxBKYKKSK8U4Q/cb=gapi.loaded
/tmp/site/label?node=0&group=1&allgroups=1&offset=0&nbins=1&attrs=Category+102275&irversion=620
/tmp/site/id?d_visid_ver=1.9.0&d_field group=A&mcorgid=700CFDC5570CBFE67F000101%40AdobeOrg&mid=49349141751585207132014752155379255530&callba
/tmp/site/id?d_visid_ver=1.9.0&d_fieldgroup=A&mcorgid=700CFDC5570CBFE67F000101%40AdobeOrg&mid=49349141751585207132014752155379255530&ts=1
/tmp/site/b/ss/global/search?q=a1,b2+c3,d&param=value
/tmp/static_assets/media/jammer/megamenu/content_spots/custom/2674305-createyourown~1.jpg
/tmp/personal/vt/data=NwqMUcvO0zp-zhtVWUbRaUuK8hKaosTsTcCU58fnwoZT5MKfrwefqzeUX84jI1IUbrkBAA7G0LvDFgsIDzCc69CTnzc8Aq4S2HX1r6Mx5VgYQuGShWuY2O0516KXD9a431pw9S06KZJs
  

Они должны быть сохранены в его URL-декодированном пути, например

  • = -> =
  • ? -> не может быть сохранен в ?, поскольку ни одна файловая система не поддерживает его, поэтому его можно заменить на -
  • В пути также есть пробел, например + .
  • и так далее.

До сих пор я мог решить следующие:

  • Удалите строку запроса после расширения файла: find . -name '*?*' -exec bash -c 'mv $0 ${0/?*}' {} ;

  • Замените символ «@» следующей командой. $ find . -name '*@*' -exec bash -c 'echo $0 ${0/@/@}' {} ;

Я попробовал аналогичный подход для переименования / перемещения каталогов, но он не работает, поскольку заменяется только 1-е вхождение.

$ find . -type d -name '*=*' -exec bash -c 'echo $0 ${0/=/=/g}' {} ; ( /g или глобальный переключатель не работает)

Среда — macOS / Cygwin в Windows. Как известно rename , команда по умолчанию в macOS не поддерживается. Одна строка будет полезна.

Пожалуйста, помогите и заранее благодарим вас.

Ответ №1:

Попробуйте использовать deurlname утилиту из renameutils пакета… Это доступно как для cygwin, так и для homebrew

Затем: find /tmp/site | tac | while read line;do deurlname "${line}";done

Кроме того, вы find переименовываете только первое вхождение, потому что после переименования родительской папки все ее содержимое завершится ошибкой с file not found . Итак, если у вас нет и вы не хотите устанавливать homebrew / renameutils, попробуйте find /tmp/site | tac | while read line;do mv "${line}" "${line//=/=}";done

Кроме того, при выполнении -exec bash -c '$0 ${0/...' вы заключаете всю команду в одинарные кавычки, поэтому, если вы попытаетесь переименовать в пробел, это не удастся. Если вы хотите его использовать, заключите имя файла в двойные кавычки как -exec bash -c 'mv "$0" "${0/...}" {} ; . Кроме того, замена переменной bash ${0/} (с одной косой чертой) заменяет только первое вхождение, поэтому используйте ${0//} для замены каждого вхождения.

Или, если вы хотите переименовать все теги URL сразу, используя find sed : find /tmp/site | tac | while read line;do mv "${line}" "$(sed -e 's|=|=|g' -e 's|&|amp;|g' -e 's|?|-|g' <<<$line)";done

Я использую, tac чтобы отменить find вывод и избежать проблемы переименования родительской папки перед дочерними.

Комментарии:

1. delurlname Утилита — это жизненный вкус. Большое спасибо. Я пробовал другие подходы, как вы упомянули, но команда mv сталкивается с некоторой проблемой и выдает ошибку No such file or directory .