ls가 하위 디렉터리에 파일을 반복적으로 나열하는 것을 방지하는 방법

ls가 하위 디렉터리에 파일을 반복적으로 나열하는 것을 방지하는 방법

예를 들어 /etc/ 디렉토리에 확장자가 없고 확장자가 있는 파일이 있습니다.

/etc/profile

/etc/profile.1

/etc/profile.2

그리고 시스템에는 일부 파일이 포함된 디렉터리가 제공됩니다.

/etc/profile.d/file1

/etc/profile.d/file2

/etc/profile.d/file3

스크립트에서 ls를 지정하여 모든 profile* 파일을 나열하지만 내 파일과 이름이 같은 디렉터리의 파일은 나열하지 않으려고 합니다.

"/etc/profile.d/"라는 디렉터리 이름이 나열되는지 여부는 중요하지 않지만 해당 디렉터리 아래의 파일은 나열되지 않아야 합니다.

내 바람은 매뉴얼 페이지에 따르면 "-R" 옵션이 지정된 경우에만 ls가 재귀적으로 작동하는 것입니다.

정렬 기능과 ls가 수정, 액세스, 생성 시간 등을 표시할 수 있기 때문에 ls를 사용하고 싶습니다.

일반적으로 다음 명령을 사용합니다.

ls -la --time-style=long-iso /etc/profile*

그러나 내 파일만 표시하는 대신 ls는 /etc/profile.d 디렉토리로 이동하여 해당 디렉토리의 파일을 나열합니다.

나는 이 예에서 주어진 이름뿐만 아니라 일반적인 해결책에 관심이 있습니다.

인사

[이메일 보호됨]

답변1

그것이 바로 ls디렉토리 의 내용 l입니다 .s

전달된 파일이 디렉터리가 아닌 경우 해당 파일이 나열됩니다. 이 유형의 파일 동작을 얻으려면목차다시 한 번 옵션을 전달해야 하며 -d, 이 경우 내용이 아닌 디렉터리 파일 자체가 나열됩니다.

ls -l -d --time-style=long-iso /etc/profile*

-a디렉토리 내용을 나열할 때만 관련이 있기 때문에 제거했습니다 ( 글로브 확장 후 쉘에 의해 목록이 전달되는 ls디렉토리 자체는 아님 ).ls

ls위의 내용은 파일 목록을 생성 하지 않지만 /etc/profile*파일 목록과 일치하는 셸로 확장된다는 점을 인식하는 것이 중요합니다 .

-d전역 확장자 를 ls.

를 사용하는 경우 내장 함수를 사용하여 파일에서 메타데이터를 검색 zsh할 수 있습니다 .stat

$ zmodload zsh/stat
$ stat -LF %FT%T.%N%z +mtime /etc/profile*
/etc/profile 2021-04-10T21:00:00.000000000+0100
/etc/profile.d 2022-09-22T17:26:49.109271759+0100

(여기에서는 명시적인 날짜 형식이 사용됨)

출력과 마찬가지로 ls개행 문자가 포함된 파일 이름은 여전히 ​​처리할 수 없습니다. 그러나 결과를 표시하는 대신 배열에 저장할 수 있습니다.

stat -nA mtimes -LF %FT%T.%N%z +mtime /etc/profile*

그런 다음 반복하십시오.

for file mtime ($mtimes) print -r -- ${(q+)file} was last modified on $mtime

또는

printf '%q was last modified on %s\n' $mtimes

또는 파일당 하나씩 호출 stat하고 결과를 연관 배열에 넣습니다. 예를 들면 다음과 같습니다.

for file (/etc/profile*)
  stat -LH s -F %FT%T.%N%z -- $file &&
    print -r -- $file, $s[size] bytes big was last modified on $s[mtime]

답변2

어때요 find?

find /etc -maxdepth 1 -name "profile*" -type f

관련 정보