Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 将前100个正则表达式匹配的文件名复制到unix中的另一个目录_Linux_Bash_Unix - Fatal编程技术网

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

Linux 将前100个正则表达式匹配的文件名复制到unix中的另一个目录,linux,bash,unix,Linux,Bash,Unix,我的用例是将所有与regex[0-9]{10}匹配的文件名复制到一个新目录。 我还必须将复制的文件限制为100个。 我试着浏览了一些资料,解释了如何使用正则表达式来实现这一点,但我对bash和unix的理解有限,这限制了我使用这个用例。 我试过类似的方法: 我们将非常感谢您的帮助 使用此命令,您可以找到所需的所有文件: $sudo find/-regextype sed-regex“[0-9]{10}” *请注意,您可以将/替换为要在其中搜索针的任何目录 有了这个,你就可以做你想做的事: $s

我的用例是将所有与regex
[0-9]{10}
匹配的文件名复制到一个新目录。 我还必须将复制的文件限制为100个。 我试着浏览了一些资料,解释了如何使用正则表达式来实现这一点,但我对bash和unix的理解有限,这限制了我使用这个用例。 我试过类似的方法:


我们将非常感谢您的帮助

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

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

有了这个,你就可以做你想做的事:


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

类似的内容应该适合您:

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

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

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

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

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}"
虽然我认为这是我见过的最好的方法之一,但如果您真的需要使用正则表达式,那么数组中的路径名扩展将不适合您。相反,您可以使用
find
查找文件(并填充数组),也可以单步遍历目录并使用内置于bash的正则表达式匹配


第一种策略,使用
find
(根据Greg):


第二种策略是使用Bash的内置regex支持,可以通过编写一些脚本来完成:

unset n
for file in *; do
  [[ $file =~ ^[0-9]{10}$ ]] &&
  mv -v "$file" dest/ &&
  (( ++n >= 100 )) && break
done
这将使用globbing来标识所有文件,然后对于与正则表达式匹配的每个文件,它移动文件并增加一个计数器。增量还检查是否超过阈值,如果超过阈值,则中断循环


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

这缺少了“限制为100个文件”的功能为什么要使用sudo?这是一个“不太理想”的解决方案。不能否认这是一个不太理想的解决方案。我猜反对票更多的是错误的解决方案。对于像我这样的新手来说,这个解决方案是一个发现:)即使对于一个特定的小用例来说似乎是安全的,但这是一个可怕的习惯,永远不应该作为一个选项提供给初出茅庐的shell程序员。@ghoti虽然你的偶像有一些观点,但肯定只有一种观点;一个我不同意的。你有没有告诉初出茅庐的厨师不要用刀,因为他们可能会割伤自己?这样的观点阻碍了实验和学习。让我们面对它:人们总是搞砸shell编程,特别是当他们试图使用解决方案中所需的宏伟结构时。我知道,了解一种工具的局限性比从不使用它要好得多。我的偶像?不知道你的意思。无论如何,没有人支持“实验和学习”,鼓励人们从事危险的行为,因为有一种替代方法可以以更高的可靠性和更低的风险实现同样的事情。你想学习吗?听取专家的意见。人们总是把shell编程搞砸这一事实应该是改进的动力,而不是维护坏习惯的理由。也。。“宏伟的建筑”?嘿,这真漂亮。尽管提到
cp-t
只在GNU coreutils中有效(因为这个问题是附加了标签的)。不错。我用1000000个文件中的100个进行了尝试。另一种附加到数组的方法是:
files=();虽然do files+=(“$file”)--这样您就不需要计数器变量了。@glennjackman,这是真的,但它与BashFAQ/020中的示例相差很远。:-)
cp "${files[@]:0:100}" /path/to/destination/
unset n
for file in *; do
  [[ $file =~ ^[0-9]{10}$ ]] &&
  mv -v "$file" dest/ &&
  (( ++n >= 100 )) && break
done