bash는 디렉토리의 첫 번째 파일을 가져옵니다

bash는 디렉토리의 첫 번째 파일을 가져옵니다

Bash에서 디렉토리의 첫 번째 파일을 얻는 방법은 무엇입니까? 첫 번째는 쉘 글로브가 가장 먼저 찾는 것입니다.

Bash에서 디렉토리의 첫 번째 파일을 찾을 때 다음을 발견했습니다.오래된 게시물매우 구체적인 요구 사항이 있습니다. 나는 일반적인 문제에 대한 나의 해결책을 후손을 위해 문서화하고 사람들에게 공유하고 싶은 대체 해결책을 제시할 수 있는 장소를 제공하고 싶습니다.

답변1

현재 디렉터리의 첫 번째 파일을 가져오려면 확장을 배열에 넣고 첫 번째 요소를 가져올 수 있습니다.

files=(*)
echo "${files[0]}"
# OR
echo "$files" # since we are only concerned with the first element

현재 디렉터리에 여러 디렉터리가 포함되어 있다고 가정하면 다음과 같이 반복하여 첫 번째 파일을 가져올 수 있습니다.

for dir in *; do
    files=($dir/*)    
    echo "${files[0]}"
done

그러나 쉘 설정에 따라 files=(*)파일이 없는 경우 하나의 요소(예: "*")를 포함하는 배열이 반환될 수 있습니다. 따라서 배열의 파일 이름이 존재하는 실제 파일과 일치하는지 확인해야 합니다(그리고 이것이 *유효한 파일 이름이라는 것을 기억하십시오).

답변2

기존의 모든 답변은 먼저 전체 디렉토리 목록을 생성하는 것으로 보이며 수천 개의 요소로 인해 시간이 걸릴 수 있으므로 간단히 다음과 같이 끝냈습니다.

ls -AU | head -1

여기서는 -U정렬되지 않음을 의미하므로 결과가 즉시 생성됩니다.

답변3

존재하다 zsh:

  • 로케일 정렬 순서에서 숨겨지지 않은 첫 번째 파일:first=(*(N[1]))
  • 동일하지만 디렉터리가 아닌 파일에만 해당됩니다.first=(*(N^/[1]))
  • 동일하지만 디렉토리에 대한 심볼릭 링크도 제외됩니다.first=(*(N^-/[1]))
  • 제한된정기적인문서:first=(*(N.[1]))
  • 동일하지만 일반 파일에 대한 심볼릭 링크를 포함합니다.first=(*(N-.[1]))

추가 참고사항:

  • 이들은대량으로변수는 여전히 저장할 수 있어야 하기 때문에바꾸다요소 수: 0(일치하는 파일 없음) 또는 1(첫 번째 항목만 선택한 일치하는 파일) 대신 스칼라 변수를 정의하려면 $first(일치하는 파일이 없는 경우 빈 문자열을 포함하도록) (){ first=$1; } *(N[1])다음과 같이 하면 됩니다. 또는 $first일치하는 파일이 없으면 스칼라 변수를 변경하지 않고 그대로 둡니다 (){ (($#)) && first=$1; } *(N[1]).
  • 숨겨진 파일을 포함하려면 Dglob 한정자를 추가하세요.
  • 일부 로캘(예: 2020년 현재 GNU 시스템에서 일반적으로 사용되는 대부분의 로캘 포함 en_US.UTF-8)에서는 일부 문자가 동일하게 정렬되기 때문에 대조가 항상 결정적이지는 않습니다. 예를 들어 다음을 참조하세요.touch

답변4

디렉토리의 첫 번째 일반 파일 이름을 얻으려면 다음을 사용할 수 있습니다.

shopt -s nullglob dotglob
unset -v name

for name in some/path/*; do
    [ -f "$name" ] && break
    unset -v name
done

이 루프 후에는 $name일반 파일의 이름이 먼저 정렬되거나 디렉터리에 일반 파일이 없으면 변수가 설정 해제됩니다 some/path.

여기에 사용된 셸 옵션은 nullglob패턴이 일치하지 않는 경우 루프가 실행되지 않도록 하고( ) 숨겨진 이름도 일치시킵니다( dotglob).

파일 이름 글로빙 패턴이 사전순으로 정렬된 목록으로 확장되었으므로 이름을 얻게 됩니다.

관련 정보