Пакетное переименование URL, закодированное имя файла и путь к папке - PullRequest
1 голос
/ 22 апреля 2019

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

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

/tmp/site/test/m%3dplusone
/tmp/site/test/m%3dplusone/rt%3dj
/tmp/site/test/m%3dplusone/rt%3dj/sv%3d1/35.jpg%3f_%3d15099203492
/tmp/site/test/m%3dplusone/rt%3dj/sv%3d1/d%3d1
/tmp/site/test/m%3dplusone/rt%3dj/sv%3d1/d%3d1/ed%3d1
/tmp/site/test/m%3dplusone/rt%3dj/sv%3d1/d%3d1/ed%3d1/am%3dwQ
/tmp/site/test/m%3dplusone/rt%3dj/sv%3d1/d%3d1/ed%3d1/am%3dwQ/rs=AGLTcCOhuNhUv0siK0B4I8EcahYmZPyCaA/cb%3dgapi.loaded_0
/tmp/site/_/scs/apps-mozaic/_/js/k%3doz.gapi.en_US.e1PemSdvnM4.O/m%3dplusone
/tmp/site/_/scs/apps-mozaic/_/js/k%3doz.gapi.en_US.e1PemSdvnM4.O/m%3dplusone/rt%3dj
/tmp/site/_/scs/apps-mozaic/_/js/k%3doz.gapi.en_US.e1PemSdvnM4.O/m%3dplusone/rt%3dj/sv%3d1
/tmp/site/_/scs/apps-mozaic/_/js/k%3doz.gapi.en_US.e1PemSdvnM4.O/m%3dplusone/rt%3dj/sv%3d1/d%3d1
/tmp/site/_/scs/apps-mozaic/_/js/k%3doz.gapi.en_US.e1PemSdvnM4.O/m%3dplusone/rt%3dj/sv%3d1/d%3d1/ed%3d1
/tmp/site/_/scs/apps-mozaic/_/js/k%3doz.gapi.en_US.e1PemSdvnM4.O/m%3dplusone/rt%3dj/sv%3d1/d%3d1/ed%3d1/am%3dwQ
/tmp/site/_/scs/apps-mozaic/_/js/k%3doz.gapi.en_US.e1PemSdvnM4.O/m%3dplusone/rt%3dj/sv%3d1/d%3d1/ed%3d1/am%3dwQ/rs=AGLTcCOhuNhUv0siK0B4I8EcahYmZPyCaA/cb%3dgapi.loaded
/tmp/site/_/scs/apps-mozaic/_/js/k%3doz.gapi.en_US.gzO-5OVAi4o.O/m%3dplusone
/tmp/site/_/scs/apps-mozaic/_/js/k%3doz.gapi.en_US.gzO-5OVAi4o.O/m%3dplusone/rt%3dj
/tmp/site/_/scs/apps-mozaic/_/js/k%3doz.gapi.en_US.gzO-5OVAi4o.O/m%3dplusone/rt%3dj/sv%3d1
/tmp/site/_/scs/apps-mozaic/_/js/k%3doz.gapi.en_US.gzO-5OVAi4o.O/m%3dplusone/rt%3dj/sv%3d1/d%3d1
/tmp/site/_/scs/apps-mozaic/_/js/k%3doz.gapi.en_US.gzO-5OVAi4o.O/m%3dplusone/rt%3dj/sv%3d1/d%3d1/ed%3d1
/tmp/site/_/scs/apps-mozaic/_/js/k%3doz.gapi.en_US.gzO-5OVAi4o.O/m%3dplusone/rt%3dj/sv%3d1/d%3d1/ed%3d1/am%3dwQ
/tmp/site/_/scs/apps-mozaic/_/js/k%3doz.gapi.en_US.gzO-5OVAi4o.O/m%3dplusone/rt%3dj/sv%3d1/d%3d1/ed%3d1/am%3dwQ/rs=AGLTcCN8zpbBBFew5eMDpwxBKYKKSK8U4Q/cb%3dgapi.loaded
/tmp/site/label%3fnode%3d0%26group%3d1%26allgroups%3d1%26offset%3d0%26nbins%3d1%26attrs%3dCategory%2b102275%26irversion%3d620
/tmp/site/id%3fd_visid_ver%3d1.9.0%26d_field%20group%3dA%26mcorgid%3d700CFDC5570CBFE67F000101%2540AdobeOrg%26mid%3d49349141751585207132014752155379255530%26callba
/tmp/site/id%3fd_visid_ver%3d1.9.0%26d_fieldgroup%3dA%26mcorgid%3d700CFDC5570CBFE67F000101%2540AdobeOrg%26mid%3d49349141751585207132014752155379255530%26ts%3d1
/tmp/site/b/ss/global/search%3Fq%3Da1%2Cb2%2Bc3%2Cd%26param%3Dvalue
/tmp/static_assets/media/jammer/megamenu/content_spots/custom/2674305-createyourown%7e1.jpg
/tmp/personal/vt/data%3dNwqMUcvO0zp-zhtVWUbRaUuK8hKaosTsTcCU58fnwoZT5MKfrwefqzeUX84jI1IUbrkBAA7G0LvDFgsIDzCc69CTnzc8Aq4S2HX1r6Mx5VgYQuGShWuY2O0516KXD9a431pw9S06KZJs

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

  • %3d -> =
  • %3f -> невозможно сохранить в?, Поскольку ни одна файловая система не поддерживает его, поэтому его можно заменить на -
  • На пути тоже есть место, как %2b.
  • и т. Д.

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

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

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

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

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

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

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

1 Ответ

1 голос
/ 23 апреля 2019

Попробуйте использовать утилиту 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//%3d/=}";done

Также, выполнив -exec bash -c '$0 ${0/...', вы вводите всю команду одинарными кавычками, поэтому, если вы попытаетесь переименовать %20 в космос, он потерпит неудачу.Если вы хотите его использовать, введите в кавычки имя файла -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|%3d|=|g' -e 's|%26|\&|g' -e 's|%3f|-|g' <<<$line)";done

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...