我的目录中有一些文件。它们可以分为两类:第一类文件的名称模式是1000-24-1-7-1
由四个破折号分隔的五个数字;第二类中的文件名称模式类似于abcd-1000-24-1-7-1-efgh-ijkl
也用破折号分隔,但在这些数字之前或之后或之前和之后都有字母。
我的问题是如何将第一类中的这些文件从我的目录中过滤出来,方法是将它们移动到名为first-class
.
答案1
对于某些 shell,您可以使用扩展的 globbing+某些标志来仅匹配一班。
和bash
:
shopt -s extglob
for one in +([0-9])-+([0-9])-+([0-9])-+([0-9])-+([0-9])
do
[[ -f $one ]] && mv -- "$one" first-class
done
+(<PATTERN>)
匹配给定模式的一次或多次出现,[[ -f ... ]]
测试常规文件 - 如果是,则将其mv
-ed 为first-class
;执行一个试运行,加echo
在前面mv
。
和zsh
:
setopt extended_glob
mv -t first-class [0-9]##(-[0-9]##)(#c4)(.)
x##
匹配模式的一次或多次出现x
,(#cN)
要求完全N
匹配并且(.)
仅匹配文件
或:
autoload zmv
zmv -Q '[0-9]##(-[0-9]##)(#c4)(.)' first-class
-Q
打开裸全局限定符,以试运行添加-n
例如zmv -Qn ...
如果不需要过滤常规文件,那么您可以不进行测试bash
:
shopt -s extglob
mv -- +([0-9])-+([0-9])-+([0-9])-+([0-9])-+([0-9]) first-class
并且没有(.)
限定符zsh
:
setopt extended_glob
mv -t first-class [0-9]##(-[0-9]##)(#c4)
或者
autoload zmv
zmv '[0-9]##(-[0-9]##)(#c4)' first-class
答案2
Bjorn 的解决方案似乎应该有效,但另一种可能性是将 find 与正则表达式一起使用,find -regextype posix-extended -regex '.*/[[:digit:]]{1,}(-[[:digit:]]{1,}){4}$'
然后您可以将其与 a-exec mv {} first-class \;
或 pipeline 一起使用到 xargs 或类似的
答案3
不会mv [0-9]*-[0-9]*-[0-9]*-[0-9]* first-class
做这招吗?