Regex найти и скопировать в Bash (сохранение структуры папок)? - PullRequest
3 голосов
/ 15 мая 2010

У меня есть папка с кучей файлов журналов. Каждый набор файлов журнала находится в папке с подробным описанием времени и даты запуска программы. В этих папках журналов у меня есть несколько видеофайлов, которые я хочу извлечь. Все, что я хочу, это видео файлы, ничего больше. Я пытался использовать эту команду только для копирования видеофайлов, но она не работала, потому что каталог не существовал.

.rmv - расширение файла, которое я хочу.

$ find . -regex ".*\.rmv" -type f -exec cp '{}' /copy/to/here/'{}'

Если у меня есть структура папок, такая как:

|--root  
   |  
   |--folder1  
   |  |  
   |  |--file.rmv  
   |  
   |--folder2  
      |  
      |--file2.rmv  

Как я могу получить его для копирования, чтобы скопировать / сюда / сюда, скопировав структуру folder1 и folder2 в каталоге назначения?

Ответы [ 4 ]

12 голосов
/ 27 мая 2012

cp имеет аргумент --parents поэтому самый короткий способ сделать то, что вы хотите, это:

find root -name '*.rmv' -type f -exec cp --parents "{}" /copy/to/here \;
2 голосов
/ 15 мая 2010

Я бы просто использовал rsync .

1 голос
/ 15 мая 2010

{} представляет полный путь к найденному файлу, поэтому ваша команда cp оценивает такие вещи:

cp /root/folder1/file.rmv /copy/to/here/root/folder1/file.rmv

Если вы просто уроните второй {}, вместо этого будет

cp /root/folder1/file.rmv /copy/to/here

форма копирования файла в директорию cp, которая должна сработать.

Кроме того, вместо -regex вы можете просто использовать операнд -name:

find root -name '*.rmv' -type f -exec cp {} /copy/to/here \;
0 голосов
/ 15 мая 2010

Предполагая, что src это ваш root, а dst ваш /copy/to/here

#!/bin/sh

find . -name *.rmv | while read f
do
       path=$(dirname "$f" | sed -re 's/src(\/)?/dst\1/')
       echo "$f -> $path"
       mkdir -p "$path"
       cp "$f" "$path"
done

поместив это в cp.sh и запустив ./cp.sh из каталога через root

Выход:

./src/folder1/file.rmv -> ./dst/folder1
./src/My File.rmv -> ./dst
./src/folder2/file2.rmv -> ./dst/folder2

РЕДАКТИРОВАТЬ: улучшенная версия скрипта (спасибо за комментарий)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...