大家好我有关于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脚本?
谢谢!
答案 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/.