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