如何从我的目录中过滤掉一些文件?

如何从我的目录中过滤掉一些文件?

我的目录中有一些文件。它们可以分为两类:第一类文件的名称模式是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做这招吗?

相关内容