复制包含在不同父文件夹中的许多文件(同名)

时间:2012-01-26 16:53:38

标签: file bash unix copy

大家好我有关于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 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:2)

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

答案 2 :(得分:2)

看看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

答案 3 :(得分:1)

这似乎可以帮助你:

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

它在目录/ f /中找到名为file.txt的所有文件,然后使用execdir(在包含匹配文件的目录中执行)将包含该文件的目录复制到目录/g/.