6

Я пытаюсь скопировать некоторые файлы в существующие папки. Это пример схемы

# origin 
/home/user/myfiles/folder1/group1/1.jpg
/home/user/myfiles/folder1/group1/2.jpg
/home/user/myfiles/folder1/group2/1.jpg
/home/user/myfiles/folder1/group2/2.jpg
/home/user/myfiles/folder2/group1/1.jpg
/home/user/myfiles/folder2/group1/2.jpg
/home/user/myfiles/folder2/group2/1.jpg
/home/user/myfiles/folder2/group2/2.jpg

Схема папки назначения уже существует, это просто исходные файлы (jpgs), которых там нет.

У меня вопрос как это сделать?

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

 cp /home/user/myfiles/*/*/*.jpg  /home2/user/myfiles/*/*/*.jpg

Мое первоначальное намерение состоит в том, чтобы использовать эту схему копирования в моем вопросе без ответа: s3cmd: как скопировать файлы из локального в корзину S3 с существующей структурой в качестве возможного решения.

2 ответа2

3

С GNU cp вы можете использовать опцию --parents , например:

cd /home/user/myfiles ; cp --parents */*/*.jpg /home2/user/myfiles/

Сначала вы должны сделать cd потому что, если вы выполните cp --parents /home/user/myfiles/... она также создаст этих родителей, и вы получите /home2/user/myfiles/home/parents/myfiles/ ,

Если вам нужен не-GNUish ответ, традиционным методом unix будет tar по каналу.

cd /home/user/myfiles ; tar cf - */*/*.jpg | ( cd /home2/user/myfiles ; tar xf - )

Второй cd находится в подоболочке со вторым tar, так что именно здесь файлы извлекаются. Тарбол сам создается, отправляется через канал и извлекается одновременно. Добавьте флаг v к одному из tars, если вы хотите получать отчеты о проделанной работе.

1

Следующее должно сделать трюк:

for i in `find /home/user/myfiles/folder1 -print`; do 
  if [ ! -d $i ]; 
    then filePath=`echo $i | cut -f 4- -d"/"`; 
         cp $i /home/user/myfiles/folder2/$filePath; 
  fi; 
done

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

Обратите внимание на «cut -f 4- » выше - он получает поля от 4-го и далее. Вы можете изменить номер по вашему желанию

Возможно, даже basename или более простая команда существует ... но пока это подойдет :)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .