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])
. - 숨겨진 파일을 포함하려면
D
glob 한정자를 추가하세요. - 일부 로캘(예: 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
).
파일 이름 글로빙 패턴이 사전순으로 정렬된 목록으로 확장되었으므로 이름을 얻게 됩니다.