将前100个正则表达式匹配的文件名复制到unix中的另一个目录

时间:2017-08-16 22:33:33

标签: linux bash unix

我的用例是将匹配正则表达式[0-9]{10}的所有文件名复制到新目录。 我还必须将复制的文件限制为100。 我试着通过几个来源解释我们如何使用正则表达式来做到这一点,但我对bash和unix的有限理解限制了我使这个用例工作。 我尝试过类似的东西: How to copy multiple files from a different directory using cp?

任何帮助都将受到高度赞赏。

5 个答案:

答案 0 :(得分:4)

bash:将所有文件存储在一个数组中,然后获取前100个元素的一部分

all_files=( [0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9] )  # glob pattern, not regex
cp -t /destination/dir "${all_files[@]:0:100}"

答案 1 :(得分:2)

这样的事情对你有用:

cp `ls -1 | egrep '[0-9]{10}' | head -100` <destination directory>

(根据您的系统,您可能有不同的grep命令,或者需要使用-e开关的命令

答案 2 :(得分:1)

虽然我认为Glenn Jackman's answer是我见过的最好的之一,如果你真的需要使用正则表达式,那么数组中的路径名扩展将不适合你。相反,您可以使用find来查找文件(并填充数组),也可以单步执行目录并使用内置的正则表达式匹配来进行bash。

第一个策略,使用find(根据Greg的BashFAQ/020):

unset files i
while IFS= read -r -d $'\0' file; do
  files[i++]="$file"
done < <(find -E ./ -type f -regex '\./[0-9]{10}' -print0)

请注意,find的{​​{1}}具有隐式-regex^个锚点。我正在使用$告诉-E我想要使用ERE而不是BRE(适用于macOS,FreeBSD,其他BSD ......)。 In Linux, you may want to use the -regextype option ......或者只是在BRE中表达自己。

然后选择Glenn建议的前100个数组项目:

find

使用Bash的内置正则表达式支持的第二个策略可能是通过一些脚本来完成的:

cp "${files[@]:0:100}" /path/to/destination/

这使用globbing来识别所有文件,然后对于与正则表达式匹配的每个文件,它会移动文件并递增计数器。增量还会检查它是否超过了您的阈值,如果是,则跳出循环。

如果你愿意的话,你可以把它变成一个单行。我在编写和测试时做了。如果你不喜欢你的脚本简洁,这当然可以写得更长。 :)

答案 3 :(得分:-1)

使用此命令,您可以找到所需的所有文件: $sudo find / -regextype sed -regex "[0-9]{10}"

*请注意,您可以替换/要搜索针的任何目录

这样你就可以做你想做的事了:

$sudo find / -regextype sed -regex "[0-9]{10}" -exec cp {} /path/you/want \;

答案 4 :(得分:-1)

感谢宝贵的建议。 我提出了以下解决方案:

ls -1 | egrep [0-9a-f]{10} | head -100 | xargs -I{} cp -f {} <your directory>