将文件名中具有特定字符串的目录中的所有文件复制到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 将所有具有特定扩展名的文件从所有子目录移动到其父目录?