Recursive copy of specific files in Unix/Linux?
我需要从目录及其所有子目录复制所有*.jar文件。在Unix/Linux终端上如何操作?命令cp -r *.jar /destination_dir不起作用。
本地文件的复制以及机器之间的复制是有用的。这就是你想要的
法国电力公司
整个目录结构复制到/目的地 xDER,但只复制Jarfiles。文件上的所有权限和时间都是不可更改的。The-M will omit empty directories.Verbose输出。
如果一个干的运行添加一个N,它会告诉你该怎么做,但事实上并不是什么都复制。
- 你能给我解释一下这部分吗:-f 'hide,! */' ?提前感谢您的帮助!
- 当然。-f意味着它是一个过滤规则(简称--filter)。规则说隐藏所有非目录,即文件。"*/"模式匹配一个目录,然后是!否定它意味着任何不是目录的东西(比如文件)。"--include=*.jar"优先于筛选器,因此只包含.jar文件。
- 太有用了,笨蛋!为了确保我得到了它,您通过说匹配不是目录的所有内容来过滤命令,这意味着所有文件。--include负责确保只考虑.m文件。最后一个问题,如果我只想复制该目录中的文件,而不复制整个目录结构呢?
- 是的,匹配所有文件并隐藏它们,除了.jar文件。我不太明白你最后一个问题:你是说把树结构压扁?如果是这样,请参见:stackoverflow.com/questions/9800989/…,或者您是说将.jar文件从目录A复制到目录B?普通的"cp"可以为您做到这一点,或者"rsync*.jar/path/to/new/dir"
- 很酷,再次感谢你的解释。我的意思是将目录A中的所有(并且仅).jar文件复制到目录B中,而不进入目录A的子目录。
- 这显然不是这个问题的正确答案,我不知道为什么它被标记为接受。
- @瑞安,至少44位上流选民并不清楚。为什么这不是这个问题的正确答案?
- @Civfan我认为Ryan想要的是将目录扁平化(即将所有JAR文件从子目录复制到一个文件夹)。这在OP的问题中是模棱两可的,因为他没有说目的地目录应该包含子文件夹还是应该是平面的。我需要它是平和的,上面肖恩提出的问题有一个很好的答案,卡兹为我工作。
- 我有一个权限问题,最初我通过做一个sudo解决了这个问题,然后我意识到"/destination_dir"在我的文件系统中的位置:p
如果你不需要目录结构,你可以使用:
1 2
| shopt -s globstar
cp **/*.jar destination_dir |
如果你需要的是目录结构,你可以检查cpS --parents选项。
- +1对于Shopt Globstar,我不知道这些东西中的任何一个,有用的。
- 感谢您指出--parents选项。它与海报的要求稍有不同:它根据需要创建文件复制所需的目录结构,而不是整个目录结构。-正是我需要的!-)
- cp -rf --parents destination_dir工作得很好
如果你发现有一个Exec开关,并CP-T选项:
1
| find . -name"*.jar" -exec cp -t /destination_dir {} + |
如果你发现不提供"+"平行召唤,你可以使用;"但你可以加入EDOCX1[3]:
1
| find . -name"*.jar" -exec cp {} /destination_dir";" |
- 如果用户不使用GNU find,则会有-exec,但不使用+命令终止符。
- 谢谢,@glennjackman。添加了一个无加的解决方案。
- @格伦纳扎克曼-1.+命令终止符由posix定义。pubs.opengroup.org/onlinepubs/009604599/utilities/find.html
- @乔丹姆,嗯。在工作中的一个Solaris 8机器上,我路径中的第一个发现是gnu find 4.1,它没有+。我想我不应该把一个10年的项目当作福音。
- @格伦:10岁?但我的只有4.4.2——看起来不那么引人注目。
- 这不会递归地复制子目录。
- @莱德:对我来说。GNU发现4.4.2版-刚刚测试过。
- 嗯,对我来说仍然不能递归地工作。find -version表示find (GNU findutils) 4.4.2。find . -name"*.jar" -exec cp -t /destination_dir {} +将所有文件扁平复制到/destination目录,但不复制它们的父目录。
- @lreeder:不,它不会复制目录,这些目录不是问题规范的一部分,而是to copy all *.jar files from directory and all its subdirectories。
1
| cp --parents `find -name \*.jar` destination/ |
From man cp
1 2
| --parents
use full source file name under DIRECTORY |
- OP把这个标记为"unix",而不是linux。afaik,cp的--parents选项仅限于Linux。
- 你的意思是"仅GNU"
1
| tar -cf - `find . -name"*.jar" -print` | ( cd /destination_dir && tar xBf - ) |
- 为什么在目的地焦油中使用B标志?手册上只写着"重读我们所读的"。在类似的环境下,我从来没有遇到过明显的问题,但我很好奇。
- @Eduardoivanec重新锁定将确保副本正确发生。linuxdevcenter.com/pub/a/linux/lpt/18_16.html。同样,从tar gnu docs,If --read-full-records (-B) is used, tar will not panic if an attempt to read a record from the archive does not return a full record. Instead, tar will keep reading until it has obtained a full record中可以看到,在大多数情况下,它应该运行良好。
- 太好了,谢谢!
- 由于这个方法的信号13(管道破裂),我有一个关于第一个焦油提前退出的问题。只复制了一些文件。
如果你想在目的地保持同样的目录层次,你可以使用
1 2
| (cd SOURCE && find . -type f -name \*.jar -exec tar cf - {} +) \
| (cd DESTINATION && tar xf -) |
这一方法,以扩展find的输出为基础,有一个优势,可以处理任何数量的文件。
ZZU1
假设您的Jar Filenames不包含空间,您的cp有选择权。如果cp不能
1
| find . -name \*.jar | xargs -I FILE cp FILE /destination_dir |