bash выборочно копирует файлы / папки в другое место - PullRequest
0 голосов
/ 10 января 2011

У меня есть цикл в моем скрипте, который перебирает массив - myArray, и мне нужно сделать некоторое копирование файлов / каталогов на каждой итерации.Массив может выглядеть следующим образом -

myArray=('ajax' 'style/prod_styles' `path/to/some_file.php` 'templates' 'uploadify')

Принимая этот массив, для элементов без / мне нужно скопировать все папки и их содержимое - например, ajax, templates, uploadify.Но для тех, у кого есть косые черты - например, style/prod_styles (обратите внимание, что может быть несколько косых черт), мне нужно скопировать только последний элемент (например, для /path/to/some/folder мне нужно скопировать только folder и его содержимое), а в случаеродительские папки не существуют в месте назначения (например, path, to, some являются родительскими папками), мне нужно просто создать эти папки и затем скопировать последний элемент (folder).

Ранее я предполагал, что было бы легко выполнить разнесение (например, PHP explode()) с / внутри цикла, а затем рекурсивно начать с родительского (path каталога, как в приведенном выше примере), чтобы проверить, является ли его дочерний каталогсуществует, если не создаст его, пока мы не закончили с родительским файлом копируемого файла / каталога, а затем сделайте окончательную копию.

Если, однако, в bash есть что-то более простое, чтобы сделать это, пожалуйста,дайте мне знать.

Спасибо,
Sandeepan

Ответы [ 3 ]

2 голосов
/ 10 января 2011

Если я не понял ваш вопрос, вам, вероятно, не нужно использовать средство, похожее на взрыв, чтобы достичь того, что вы хотите.

Пример:

# dir to copy to    
DESTINATION='/path/to/copy/to/.'

# dir to copy from
SOURCE='.' 

# list of dirs to copy
myArray=('ajax' 'style/prod_styles' 'templates' 'uploadify')

# for each directory in myArray ...
for d in "${myArray[@]}"
do
    if [ -f "$d" ]; then # it this is a regular file

        # create base directory
        mkdir -p $DESTINATION/$(dirname "$d")

        # copy the file
        cp "$SOURCE/$d" $DESTINATION/$(dirname "$d")

    elif [ -d "$d" ]; then # it is a directory

        # create directory (including parent) if it doesn't exist
        # - this does nothing if directory exists
        mkdir -p "$DESTINATION/$d"

        # recursive copy
        cp -r "$SOURCE/$d/"* "$DESTINATION/$d/."

    else 

        # write warning to stderr. do nothing with this entry
        echo "WARNING: invalid entry $d." >&2

    fi
done

Обновление:

Обновлен пример кода для поддержки относительного пути в пределах пункта назначения.Поэтому styles/prod_styles будет скопировано в $DESTINATION/styles/prod_styles, но все остальные элементы в styles/ не будут скопированы.

Обратите внимание, что необходимо добавить некоторые дополнительные проверки, если нельзя быть уверенным, что:

  • путь, указанный в DESTINATION существует
  • не все значения в myArray являются действительными каталогами (не файлами)

Обновление 2:

ПримерОбновлен код для обработки обычных файлов и каталогов.

2 голосов
/ 10 января 2011

Мне не на 100% ясно, что вы подразумеваете под «только последним элементом»; команда cp копирует только последний элемент в пути к месту назначения. Я предполагаю, что вы хотите сохранить относительный путь в пункте назначения:

path=style/prod_styles
dest=/path/to/some/folder

# Create same path structure
destPath="${dest}/$(dirname "$path")"
mkdir -p "${destPath}"

# copy src folder into correct place
cp -r "$path" "${destPath}"

Обратите внимание, что это также работает, когда path не содержит косых черт. В этом случае dirname возвращает ..

Если вы хотите использовать только последнюю часть пути (так что style/prod_styles становится prod_styles), то вам не нужно делать ничего особенного:

path=style/prod_styles
dest=/path/to/some/folder

mkdir -p "${dest}"

# copy src folder into correct place
cp -r "$path" "${dest}"
0 голосов
/ 10 января 2011

Один метод для проверки, если строка содержит косую черту:

case "$var" in
  */*) echo "I have a slash" ;;
  *)   echo "no slash for me" ;;
esac
...