11

例如,一个目录可能包含文件

12_foo9.dat
34foo32.txt
24foobar.png
997_bar.txt

我想将文件名中带有“foo”的文件复制到一个单独的目录中,以便它包含前三个文件但不包含第四个文件。

我环顾四周,但还没有想出办法做到这一点。该目录有非常多的文件,但只有 1% 左右我需要复制。

谢谢

4

5 回答 5

17
$ mkdir NEWDIR

$ touch foo_file file_foo file_foo_file

$ ls
NEWDIR      file_foo    file_foo_file   foo_file

$ cp -v *foo NEWDIR/
file_foo -> NEWDIR/file_foo

$ cp -v foo* NEWDIR/
foo_file -> NEWDIR/foo_file

$ cp -v *foo* NEWDIR/
file_foo -> NEWDIR/file_foo
file_foo_file -> NEWDIR/file_foo_file
foo_file -> NEWDIR/foo_file

$ ls NEWDIR/
file_foo    file_foo_file   foo_file
于 2013-01-17T02:43:08.770 回答
11

试试这个说法:cp *foo* /newdir

于 2013-01-17T01:58:37.747 回答
2
cp *foo* /path/to/separate_directory

如果要验证将首先包含的文件,请使用:

ls *foo*

这将确认要匹配的文件,然后您可以使用 cp 命令重新使用相同的模式来执行复制。

于 2013-01-17T01:57:45.797 回答
2

如果您真的关心文件的数量(例如运行数百万),您可以使用:

find . -type f -depth 1 -name "*foo*" -exec cp {} /otherdir \; -print

这不使用 shell 扩展,因此您不会尝试运行带有一百万个参数的命令。给你一些进展的-print迹象,可以省略。简单地列出要复制的文件:

find . -type f -depth 1 -name "*foo*"
于 2013-01-17T02:31:27.397 回答
0

使用通配符

shopt -s failglob
echo cp *foo* /path/to/separate

这将输出复制命令(或失败bash: no match: *foo*)。

echo当您验证输出以实际复制目录条目时,请删除。

于 2013-01-17T01:57:28.967 回答