将文件名中具有特定字符串的目录中的所有文件复制到Bash中的不同目录[关闭]

Posted

技术标签:

【中文标题】将文件名中具有特定字符串的目录中的所有文件复制到Bash中的不同目录[关闭]【英文标题】:Copy all files in a directory with a particular string in the filename to different directory in Bash [closed] 【发布时间】:2012-12-31 12:25:07 【问题描述】:

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

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

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

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

谢谢

【问题讨论】:

【参考方案1】:
$ 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

【讨论】:

-v 有什么作用? -v 是“详细”标志,导致它准确输出正在移动的文件【参考方案2】:

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

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

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

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

【讨论】:

【参考方案3】:

使用globbing:

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

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

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

【讨论】:

“回声”有什么好处?它没有说明将包含哪些文件。如果需要,您需要“ls foo”确认将匹配的文件,然后“cp foo /target”复制相同的文件。实际上,我想我会将这个建议添加到我的答案中...... @DreadPirateShawn:感谢您的评论。我已经更新了我的答案(使用 Bash v4.2.37 测试)。【参考方案4】:
cp *foo* /path/to/separate_directory

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

ls *foo*

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

【讨论】:

【参考方案5】:

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

【讨论】:

谢谢,这么简单,不好意思问了这么明显的问题! NP - 我不想急于争取代表,但随时接受这个答案:-)

以上是关于将文件名中具有特定字符串的目录中的所有文件复制到Bash中的不同目录[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

将具有特定名称的文件复制到相应的目录

如何将文件递归复制到具有特定名称的所有文件夹中(首选批处理文件)

将具有特定(相同)名称的子文件夹复制到目标

如何使用 CMD 将所有具有特定扩展名的文件从所有子目录移动到其父目录?

有没有一种好方法可以将文件中具有特定字符(不是文件名)的 .txt 文件移动到另一个目录?

如何为 Linux 目录中的所有文件运行脚本? [复制]