将文件名中包含特定字符串的目录中的所有文件复制到Bash中的不同目录

时间:2013-01-17 01:55:12

标签: file bash copy filenames directory

例如,目录可以包含文件

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

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

我环顾四周,但还没有找到办法做到这一点。该目录有大量文件,但只有1%左右我需要复制。

由于

5 个答案:

答案 0 :(得分:9)

$ 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

答案 1 :(得分:5)

试试这句话:cp *foo* /newdir

答案 2 :(得分:2)

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

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

这不使用shell扩展,因此您不会尝试运行具有一百万个参数的命令。 -print为您提供了一些进度指示,可以省略。只需列出要复制的文件:

find . -type f -depth 1 -name "*foo*"

答案 3 :(得分:1)

cp *foo* /path/to/separate_directory

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

ls *foo*

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

答案 4 :(得分:0)

使用globbing

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

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

在您确认输出实际复制目录条目时删除echo