예를 들어 /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