#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¶m=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
.