скопировать много файлов (одно имя), содержащихся в другой папке отца - PullRequest
5 голосов
/ 26 января 2012

Привет, ребята. У меня вопрос по командной строке Unix.У меня много таких файлов:

/f/f1/file.txt

/f/f2/file.txt

/f/f3/file.txt

and so on...

Я бы хотел скопировать все file.txt с их папкой папа в другую папку g , например:

/g/f1/file.txt

/g/f2/file.txt

/g/f3/file.txt

Я не могу скопировать все содержимое folder f, потому что в каждом sub-folder f1, f2, ... есть много других файлов, которые я не хочу копировать.

Как я могу сделать это с помощью командылиния?В конце концов, используя скрипт bash?

Спасибо!

Ответы [ 4 ]

6 голосов
/ 26 января 2012

Руководство по cp показывает эту опцию -

--parents
              use full source file name under DIRECTORY

Так что если вы на bash v4, вы можете сделать что-то вроде этого -

[jaypal:~/Temp/f] tree
.
├── f1
│   ├── file.txt  # copy this file only with parent directory f1
│   ├── file1.txt
│   └── file2.txt
└── f2
    ├── file.txt  # copy this file only with parent directory f2
    ├── file1.txt
    └── file2.txt

2 directories, 6 files
[jaypal:~/Temp/f] mkdir ../g
[jaypal:~/Temp/f] shopt -s globstar
[jaypal:~/Temp/f] for file in ./**/file.txt; do cp --parents "$file" ../g ; done
[jaypal:~/Temp/f] tree ../g
../g
├── f1
│   └── file.txt
└── f2
    └── file.txt

2 directories, 2 files
2 голосов
/ 26 января 2012

Взгляните на rsync .Предполагая, что вы находитесь в '/',

rsync -r f/ g/ --include "*/" --include "*/file.txt" --exclude "*"

Первое включение необходимо, чтобы rsync заглянул внутрь подкаталогов (и противодействовал последнему исключению).Второе включение выбирает файлы, которые вы хотите скопировать.Исключение гарантирует, что другие файлы не будут обработаны в / f, которые не имеют требуемого шаблона.

Примечание: если у вас есть символические ссылки, rsync скопирует ссылку , а неукажите ссылку на файл, если вы не укажете --copy-links.

Пример:

$ find f g -type f
f/f1/file.txt
f/f1/fileNew.txt
f/f2/file.txt
f/f3/file.txt
find: g: No such file or directory
$ rsync -r f/ g/ --include "*/" --include "*/file.txt" --exclude "*"
$ find f g -type f
f/f1/file.txt
f/f1/fileNew.txt
f/f2/file.txt
f/f3/file.txt
g/f1/file.txt
g/f2/file.txt
g/f3/file.txt
2 голосов
/ 26 января 2012

tar иногда полезен для копирования файлов: см. Небольшой тест:

kent$  tree t g
t
|-- t1
|   |-- file
|   `-- foo ---->####this file we won't copy
|-- t2
|   `-- file
`-- t3
    `-- file
g

3 directories, 4 files

kent$  cd t

kent$  find -name "file"|xargs tar -cf - | tar -xf - -C ../g

kent$  tree ../t ../g
../t
|-- t1
|   |-- file
|   `-- foo
|-- t2
|   `-- file
`-- t3
    `-- file
../g
|-- t1
|   `-- file
|-- t2
|   `-- file
`-- t3
    `-- file
1 голос
/ 26 января 2012

Похоже, это поможет вам:

find /f/ -name file.txt -execdir cp -R . /g/ \;

Он находит все файлы с именем file.txt в каталоге / f /, а затем, используя execdir (который выполняется в каталоге, содержащемсопоставленный файл), копирует каталог, содержащий файл, в каталог /g/.

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