在Bash中将文件名包含特定字符串的目录中的所有文件复制到另一个目录。

12
例如,一个目录可以包含文件。
12_foo9.dat
34foo32.txt
24foobar.png
997_bar.txt

我希望将文件名中包含“foo”的文件复制到另一个目录中,使该目录包含前三个文件但不包含第四个。

我已经搜索过,但还没有找到这样做的方法。该目录有大量文件,但只有1%左右需要复制。

谢谢

5个回答

18
$ 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
-v 是什么意思? - aerin
1
“-v”是“详细模式”标志,会输出正在移动的确切文件。 - Matt

11

尝试这个语句:cp *foo* /newdir



谢谢,这很简单,很抱歉问了一个如此明显的问题! - user1811736
NP - 我不想为了声望而苦苦奋斗,但你可以随意接受这个答案 :-) - dough

3
如果你真的关心文件数量(例如运行在百万级别),你可以使用以下方法:
find . -type f -depth 1 -name "*foo*" -exec cp {} /otherdir \; -print

这里没有使用shell扩展,所以您不会尝试使用数百万个参数运行命令。 -print 提供了一些进度指示,但可以省略。要简单地列出要复制的文件:

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

2
cp *foo* /path/to/separate_directory

如果您想要先验证将要被包含的文件,则使用:

ls *foo*

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


0
使用globbing
shopt -s failglob
echo cp *foo* /path/to/separate

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

在确认输出后,移除 echo 命令以实际执行 复制 目录条目。


“echo”有什么好处?它没有澄清哪些文件将被包含。如果您想要这个解释,您需要使用“ls foo”来确认将匹配的文件,然后使用“cp foo /target”来进行复制。实际上,我认为我会在我的答案中添加这个建议… - DreadPirateShawn
@DreadPirateShawn:感谢您的评论。我已更新我的答案(在Bash v4.2.37中进行了测试)。 - johnsyweb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接