змінити все дерево каталогів на малі імена


12

Я працюю над перетворенням веб-сайтів. Файли, якими вони були пов’язані та подані з веб-сервера, були нечутливими до регістру. Але я зробив дамп сайту в моїй системі Linux і пишу сценарії для міграції даних. Проблема полягає в тому, що я стикаюся з проблемами чутливості до регістру між рядками посилань на сторінках та фактичним регістром слова у файловій системі.

Наприклад, на сторінці може бути посилання на кшталт <a href='/subfolder/PageName.asp'>фактичного файлу /subfolder/pagename.asp. Так само і з зображеннями - <img src='spacer_sm.gif'>можливо Spacer_Sm.gif.

Тому я думав змінити всі каталоги та назви файлів на їхні малі регістри для завантаження сайту. Як це зробити (і чи може бути кращий спосіб?)

Навіть якщо є команди Unix, у яких є перемикачі нечутливості регістру, я використовую php, тому не всі команди файлової системи мають варіанти чутливості до регістру.


2
Дивіться аналогічне попереднє запитання . Тут я переказав простішу відповідь, оскільки питання дещо конкретніше.
Жил 'ТАК - перестань бути злим'

Відповіді:


8

Я не знаю, чи має ваш аромат Unix rename. Багато Linux має, і це частина пакету perl, якщо ви шукаєте сховище.

find ./ -depth -exec rename -n 'y/[A-Z]/[a-z]/' {} ";"

Наведена вище версія с

rename -n 

насправді не виконує дії, а лише друкує те, що було б зроблено. Ви пропускаєте -n, ​​щоб зробити це реально.


Яка "мова" чи регулярний вираз є 'y/[A-Z]/[a-z]/'частиною?
користувач394

Ну, оскільки renameце частина perlпакету, я думаю, perl, але шаблон використовується і в sed, і, можливо, AWKтакож. Я лише sedдобре знаю тиху. Я перекладаю yна translateабо map, але я не знаю , де походження з символів.
користувач невідомий

Повинно бути пергелекс - у своїй відповіді Джилль пише renameсценарій perl.
користувач394

Так, і ви можете використовувати регекси perl, щоб змінити назви файлів, які не обов'язково укладаються з написання в perl, але це може бути цікавішим питанням.
користувач невідомий

9

Зш

zmv -o-i '(**/)(*)' '$1${2:l}'

Пояснення: zmvперейменовує файли, що відповідають шаблону відповідно до заданого тексту заміни. -o-iпередає -iопцію до кожної mvкоманди під кришкою (див. нижче). У тексті заміни, $1, $2і т.д., є послідовною Дужками групи в шаблоні. **означає всі (під) * каталоги, рекурсивно. Фінал (/)- це не дужка група, а глобальний класифікатор, що означає відповідати лише каталогів. ${2:l}перетворюється $2в малі регістри.

Перейменувати Perl

Тут я використовую сценарій перейменування Perl, який Debian і Ubuntu поставляють /usr/bin/prename(як правило, доступні також rename). З bash ≥4 або zsh:

shopt -s globstar  # only in bash
rename 's!/([^/]*/?)$!\L/$1!' **/*

З іншими оболонками:

find . -depth -exec rename -n 's!/([^/]*/?)$!\L/$1!' {} +

Портативний

Рекурсивно:

find . -depth -exec sh -c '
    t=${0%/*}/$(printf %s "${0##*/}" | tr "[:upper:]" "[:lower:]");
    [ "$t" = "$0" ] || mv -i "$0" "$t"
' {} \;

Використання -depthгарантує, що глибоко вкладені каталоги обробляються перед своїми предками.


1

Він не працював над такою структурою каталогу:

JKL/
deF/
ABC/DEf
ABC/gHi
ghi/jkL

Ось приклад, який працює:

for i in `find | sort -r | sed '$d'`; do \
   b=${i%/*}; e=${i##*/}; mv $i $b'/'${e,,}; done

Для пояснення щодо bта eваріантів:

man bash

Потім використовуйте таку послідовність клавіш: /,,Enterbb


0

Прийнята відповідь не спрацювала для мене, оскільки вона намагалася змінити всі каталоги відразу. Я знайшов ще одне рішення щодо stackexchange, дуже схожого на портативний з Gilles вище: від Baramin -
/programming/4268591/unix-rename-files-directories-to-uppercase

Я скопіював це тут:

find . -depth | \
while read LONG; do
   SHORT=$( basename "$LONG" | tr '[:lower:]' '[:upper:]' )
   DIR=$( dirname "$LONG" )
   if [ "${LONG}" != "${DIR}/${SHORT}"  ]; then
     mv "${LONG}" "${DIR}/${SHORT}"
   fi
done

На яку я змінив команду tr на ie: sed s / cat / dog / g

Будь-яка подяка виходить Бараміну за посиланням вище.ie

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.