번호가 매겨진 디렉토리에서 파일 찾기

번호가 매겨진 디렉토리에서 파일 찾기

아래 디렉터리에서 깊이 1(이 경우 6~11)의 번호가 매겨진 디렉터리에 중첩된 파일 목록을 원합니다.

$ ls *
1.org   2.MOV  3.MOV  4-1.MOV  5-1.mp4  5-2.MOV  5-2.org~  9-2.MOV
1.org~  2.org  3.org  4-1.org  5-1.org  5-2.org  9-1.MOV

10:
10.mp4

11:
11.MOV

6:
6.mp4

7:
7.MOV

8:
8.MOV

6.mp4예를 들어 대신 반환 하고 싶습니다 2.MOV. 먼저 시도해 보세요(10 11이 빠졌기 때문에 완벽하지 않다는 것을 알고 있습니다). 사용해 보았지만 depth위치 문제가 있습니다.

$ find . -type f -path [^0-9]/* 
./11/11.MOV
./5-1.mp4
./5-1.org
./4-1.MOV
./10/10.mp4
./7/7.MOV
./2.org
./3.org
./2.MOV
./5-2.org
./3.MOV
./5-2.org~
./5-2.MOV
./1.org
./1.org~
./8/8.MOV
./4-1.org
./9-2.MOV
./9-1.MOV
./6/6.mp4

답변1

find별도로 지정하지 않는 한 현재 디렉터리에 포함된 모든 항목이 표시되기 때문에 이러한 결과를 얻을 수 있습니다 . 현재 디렉토리에서 6-11이라는 번호가 매겨진 디렉토리의 파일만 보려면 다음이 필요합니다.

9가 없으므로 다음을 사용할 수 있습니다.

find {6,7,8,10,11} -type f

이렇게 하면 포함된 숫자만 확장됩니다.

6에서 11 사이의 숫자가 모두 있는 경우:

find {6..11} -type f

그러면 6-11이라는 디렉터리의 파일만 찾아서 반환됩니다.

이것이 현재 디렉토리의 유일한 디렉토리인 경우(결과에 따르면) 다음을 수행할 수도 있습니다.

find . -mindepth 2 -type f

현재 디렉터리 아래에서 한두 수준 아래에서 시작하도록 지시합니다.

답변2

ls */

그러면 현재 디렉터리에 숨겨져 있지 않은 모든 하위 디렉터리의 내용이 나열됩니다. 숫자 이름이 있는 하위 디렉터리만 있는 것으로 나타나므로 해당 하위 디렉터리의 내용이 표시됩니다.

쉘 글로빙 패턴은 *현재 디렉토리에서 숨겨지지 않은 모든 이름으로 확장됩니다. /패턴 끝에 를 추가하면 패턴이 디렉토리로만 확장됩니다( /디렉토리가 아닌 이름은 이름에 포함될 수 없으므로).

셸을 사용하면 zsh다음 파일 이름 globbing 패턴이 다음으로 확장됩니다.정기적인각 하위 디렉터리의 파일

*/*(.)

일치하는 이름에 대해 일부 작업을 수행하려면 glob 패턴 확장을 반복할 수 있습니다.

for pathname in */*(.); do
    # use "$pathname" here
done

bash또는 에서는 sh작은 스크립트를 호출할 수 있습니다 find.

find . -mindepth 2 -maxdepth 2 -type f -exec sh '
    for pathname do
        # use "$pathname" here
    done' sh {} +

근데 글쓰는 방법이 좀 특이하네요

for pathname in */*; do
    [ ! -f "$pathname" ] && continue
    # use "$pathname" here
done

단, 이 find변형은 일반 파일에 대한 심볼릭 링크를 건너뛰고 숨겨진 이름을 포함합니다( 이러한 이름을 포함 dotglob하도록 셸 옵션 설정).bash

다시 말하지만, 이는 원하는 대로(숫자 이름으로 디렉토리 보기) 수행됩니다.오직숫자 이름을 가진 하위 디렉터리가 있습니다.

다른 하위 디렉터리가 있을 수 있다고 가정하면,

for pathname in */*; do
    [ ! -f "$pathname" ] && continue
    case $(dirname "$pathname") in
        *[!0-9]*) continue
    esac
    # use "$pathname" here
done

또는 bash,

for pathname in */*; do
    if [ ! -f "$pathname" ] ||
       [[ $(dirname "$pathname") == *[!0-9]* ]]
    then
        continue
    fi
    # use "$pathname" here
done

이러한 루프는 하위 디렉터리의 모든 이름을 반복하지만 일반 파일(또는 파일에 대한 심볼릭 링크)을 참조하지 않는 모든 이름을 건너뛰고 이름에 숫자가 아닌 내용이 포함된 하위 디렉터리의 모든 파일도 건너뜁니다.

extglob다음의 쉘 옵션을 사용하여 bash더 짧게 만들 수 있습니다 .

shopt -s exglob
for pathname in +([0-9])/*
    [ ! -f "$pathname" ] && continue
    # use "$pathname" here
done

패턴은 +([0-9)/이름에 숫자만 포함된 디렉터리 이름으로 확장됩니다. 옵션이 대신 설정된 zsh경우 에도 작동합니다 .KSH_GLOBextglob

GNU를 사용하면 find분명히 숫자 디렉터리를 선택한 다음 해당 내용을 반복할 수 있습니다.

find . -maxdepth 1 -type d -regex '.*/[0-9]+$' -exec sh '
    for dirpath do
        for pathname in "$dirpath"/*; do
            [ ! -f "$pathname" ] && continue
            # use "$pathname" here
        done
    done' sh +

그러나 일반적으로 파일 이름이나 디렉터리 이름에 정규식을 사용하는 것은 권장하지 않습니다. 정규식은 주로 텍스트 파일의 텍스트를 일치시키는 데 사용되기 때문입니다. findGNU 소프트웨어는 가능한 한 편리하도록 노력하기 때문에 GNU는 정규 표현식과 경로 이름 일치를 지원하는 것 같습니다.

관련 정보