내 디렉터리에서 일부 파일을 어떻게 필터링할 수 있나요?

내 디렉터리에서 일부 파일을 어떻게 필터링할 수 있나요?

내 디렉토리에 일부 파일이 있습니다. 두 가지 범주로 나눌 수 있습니다. 첫 번째 범주의 파일 이름 패턴은 1000-24-1-7-14개의 대시로 구분된 5개의 숫자입니다. 두 번째 범주의 파일 이름 패턴은 유사 abcd-1000-24-1-7-1-efgh-ijkl하며 대시로 구분되지만 앞에 또는 뒤에 문자가 있습니다. 저것.

내 질문은 이러한 파일을 내 디렉터리의 첫 번째 범주에 있는 디렉터리로 이동하여 필터링하는 방법입니다 first-class.

답변1

일부 쉘의 경우 확장 globbing + 특정 플래그를 사용하여 일치시킬 수 있습니다1등급.
그리고 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}$'그런 다음 -exec mv {} first-class \;xargs 또는 이와 유사한 파이프라인이나 파이프라인과 함께 사용할 수 있습니다.

답변3

mv [0-9]*-[0-9]*-[0-9]*-[0-9]* first-class이 작업을 수행하는 방법을 모르십니까 ?

관련 정보