Рекурсивно копия (и переименовывают), файлы к их собственному тот же каталог с другим именем

Этот Q и A покроют очень определенный все же общий падеж: учитывая многие файлы с тем же или аналогичным именем каждый в его собственном каталоге, создайте копию каждого из них в их исходном каталоге, но с другим именем.

Вы могли бы задаться вопросом, какой редкий случай потребует такой операции. Это не настолько редко. Некоторое появляющееся программное обеспечение, expecially те, которые на основе MVC (Модель / Представление / Контроллер) шаблоном разработки, могут потребовать, чтобы программист реализовал различные компоненты каждый в различном каталоге.

Пример:

software root
|
|-- Model => MyCustomComponent.php
|
|-- View => MyCustomComponent.php
|
|-- Controller => MyCustomComponent.php
|
\-- Translations
         |
         |-- English => MyCustomComponent.php
         |
         |-- French => MyCustomComponent.php
         |
         |-- Italian => MyCustomComponent.php
         |
         |-- Spanish => MyCustomComponent.php
         |

Примером довольно известного программного обеспечения, реализовывая такую структуру было бы популярное приложение электронной коммерции OpenCart. Но существуют многие другие.

Обычная практика должна создать новые компоненты путем копирования существующего или базового, применить изменения и сохранить их. В случае, если наследование и подобный не может помочь нам, мы заканчиваем тем, что имели необходимость копировать 10-20 файлов. Совершенно скучный и подверженный ошибкам процесс.

Это - типичный пример: от банковского перевода сценарий реализует прямой дебетовый сценарий при помощи первого как "шаблонный код" (не колотите меня, я не создал эту архитектуру). Между переводами, Моделью, Представлением и управлением Контроллером и другими, количество файлов для копирования каждого в его глубоком каталоге быстро становится громоздким.

Lots of same name files, one per directory

2
задан 11 March 2014 в 00:54

1 ответ

Этот небольшой сценарий приходит на помощь точно в этой ситуации.

Учитывая начальный каталог, шаблон имени файла, исходная часть имени файла для изменения и целевая часть имени файла для использования это будет:

  • Глубоко скопируйте все файлы соответствия, сохраняющие атрибуты по новым (копия)

или

  • Глубоко переименуйте все файлы соответствия к новым именам (переименовывают)

или

  • Просто покажите список предварительного просмотра потенциально затронутых файлов (предварительный просмотр).

Последняя опция expecially полезна, потому что выбор правильного соответствия, которое покрывает массу файлов с изменениями имен или изменениями расширений, может quicky становиться проблемой. Постарайтесь не получать полную путаницу путем предварительного просмотра изменений прежде, чем применить их!

Сценарий очень прост и не имеет НИКАКОЙ отговорки о том, чтобы быть лучшим, самым быстрым, самым чистым, самым безопасным. Это - то, какие работы для меня и я решил совместно использовать его в надежде, кто-то еще возьмет преимущество.

При запуске его без параметров или неправильной команды это покажет некоторые краткие инструкции:

./copy_multi_files.sh

Usage:
./copy_multi_files.sh command path name_pattern src dest
If command is 'copy' then the script copies src to dest
If command is 'rename' then the script renames src to dest
If command is 'preview' then the script just shows the matched files
Inside path, for every file name matching name_pattern, it copies every src file to dest file


Параметры:

  • Команда: это может быть один из copy, rename или preview. Копия выполняет рекурсивную глубокую копию на новые файлы, переименуйте просто массу, переименовывает существующие файлы, предварительный просмотр просто показывает, какие файлы будут затронуты и как.

  • Путь: это - начальный каталог. Я предлагаю делать эксперименты на маленьких каталогах для получения уверенности со сценарием прежде примеряющий 4 peta-триллиона файловых систем записей.

  • Name_pattern: это решает, какие файлы должны быть затронуты, таким образом, будет важно выбрать разумное значение. В примере, если я хотел выбрать много сценариев, имя которых запускается с "sendmail", который я мог указать s* для этого параметра. Для тех, кто знает о командах оболочки, этот шаблон внутренне передается find.

  • src: это - часть, шаблон имени файла для замены dest при формировании скопированных имен файлов.

  • dest: это - то, какие замены src в новых скопированных файлах называет.

Немного проверки работоспособности выполняется так, чтобы name_pattern и src приведите к последовательным результатам. Таким образом, только файлы то соответствие name_pattern и также содержите src выбраны.

Сбивать с толку? Не волнуйтесь, я подготовил некоторые примеры и "глюки".


Простой, один пример папки:

У нас есть некоторые файлы в названном подкаталоге: apps/res/

Мы хотим скопировать все файлы, имя которых содержит слово: sendmail в новые файлы это вместо sendmail иметь newthing.

Вот частичный список apps/res/ содержание:

robot.php
sendmail_test.php
sendmail_test2.php
sendmail_test3.php
showinfo.php
show_server_vars.php
version.php

Мы можем дать следующую команду:

./copy_multi_files.sh preview apps/res/ s* sendmail newthing

Эта командная строка говорит нам, что мы просто хотим a preview; начальный каталог apps/res/ (то есть, это находится под нашим текущим каталогом), что мы собираемся искать все начало файлов s (s*). Среди найденных файлов мы собираемся выбрать только тех, имя которых содержит sendmail и скопируйте их в файлы, находящиеся в тех же каталогах, но с sendmail замененный newthing.

Вот вывод этого предварительного просмотра:

apps/res/sendmail_test.php => apps/res/newthing_test.php
apps/res/sendmail_test2.php => apps/res/newthing_test2.php
apps/res/sendmail_test3.php => apps/res/newthing_test3.php

Вы видите, даже если мы указали s* как шаблон поиска, сценарий был достаточно "умен", чтобы просто выбрать подмножество "начала s" файлы, который также содержит "sendmail".

Давайте выполним команду:

./copy_multi_files.sh copy apps/res/ s* sendmail newthing

ls apps/res/ покажет, как теперь у нас есть оба исходные файлы, но также и те же файлы с newthing. Если бы мы использовали, "переименовывают" в строке выше, мы только имели бы newthing файлы.

newthing_test.php
newthing_test2.php
newthing_test3.php
robot.php
sendmail_test.php
sendmail_test2.php
sendmail_test3.php
showinfo.php
show_server_vars.php
version.php

Давайте изменим файлы снова. На этот раз мы переименовываем их:

./copy_multi_files.sh rename apps/res/ new* new even_newer_

Заметьте значения, используемые для различных параметров. Каталог теперь следующий:

even_newer_thing_test.php
even_newer_thing_test2.php
even_newer_thing_test3.php
robot.php
sendmail_test.php
sendmail_test2.php
sendmail_test3.php
showinfo.php
show_server_vars.php
version.php


Более сложный пример: давайте переместимся в главную папку установки OpenCart и возвратимся к банковский перевод файлы MVC. Мы должны создать копии тех файлов, каждого в его соответствующем каталоге. Они будут использоваться для реализации прямого дебетового платежного модуля. Вот командная строка и извлечение вывода:

./copy_multi_files.sh preview . ban* bank_transfer.* direct_debit

./catalog/view/language/russian/payment/bank_transfer.php => ./catalog/view/language/russian/payment/direct_debit
./catalog/view/language/czech/payment/bank_transfer.php => ./catalog/view/language/czech/payment/direct_debit
./catalog/view/theme/default/template/payment/bank_transfer.tpl => ./catalog/view/theme/default/template/payment/direct_debit


Ой!Что-то пошло не так! Удачный нас, для того, что использовал предварительный просмотр. Что случилось в вышеупомянутой команде? "src" аргументом является неправильный.Действительно, bank_transfer.* внутренне передается прямому "поиску и замене" функция (sed). Это не расширено с "файлом globbing" функция, но как регулярное выражение. Поэтому все файлы в предварительном просмотре преобразовываются в: direct_debit.


Теперь, когда мы знаем об этом глюке, мы можем переписать командную строку для достижения желаемого результата:

/var/www/copy_multi_files.sh preview . ban* bank_transfer direct_debit

./catalog/view/language/russian/payment/bank_transfer.php => ./catalog/view/language/russian/payment/direct_debit.php
./catalog/view/language/czech/payment/bank_transfer.php => ./catalog/view/language/czech/payment/direct_debit.php
./catalog/view/theme/default/template/payment/bank_transfer.tpl => ./catalog/view/theme/default/template/payment/direct_debit.tpl

Теперь это работает! Теперь расширения сохраняются, даже когда они изменяются (.php и .tpl).

Следует за небольшим исходным кодом сценария. Я настоятельно рекомендую сохранить резервные копии прежде, чем сделать "живой", переименовывает и всегда использовать функциональность предварительного просмотра. Помните, это - рекурсивный сценарий Unix, его эффекты могут быть чрезвычайно противными и необратимыми!

Исходный код:

#!/bin/sh

if [ "$#" -eq 0 ] || ( [ "$1" != "preview" ] && [ "$1" != "copy" ] && [ "$1" != "rename" ] )
        then
        echo "Usage:"
        echo "$0 command path name_pattern src dest"
        echo "If command is 'copy' then the script copies src to dest"
        echo "If command is 'rename' then the script renames src to dest"
        echo "If command is 'preview' then the script just shows the matched files"
        echo "Inside path, for every file name matching name_pattern, it copies every src file to dest file"
        echo
        exit 1
fi

for f in $(find "$2" -type f -name "$3" -name "*$4*" )
do
        z=`echo "$f" | sed s/"$4"/"$5"/`

        case "$1" in
                "preview") echo "$f => $z"
                ;;
                "copy") cp -p "$f" "$z"
                ;;
                "rename") mv "$f" "$z"
                ;;
        esac
done
1
ответ дан 2 December 2019 в 05:17

Другие вопросы по тегам:

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