이 명령에는 발견된 각 파일/폴더에 대해 사용자가 지정한 메타데이터를 인쇄하는 find
편리한 연산자가 있습니다 . -printf
명령에 그러한 옵션이 있습니까 ls
?
대안으로 관심 있는 파일 이름 목록을
find
대신 에 제공할 수 있지만 ls
이는 즉석에서 큰 망치를 사용하는 것처럼 보입니다. 관심 있는 파일이 이미 있지만 실제로는 아무것도 "찾을" 수 없습니다.
find
또한 필요한 파일 경로를 추가할 수 없기 때문에 경로를 제공하는 것이 까다로울 수 있습니다.끝명령 find
. 명령 find
에 경로가 필요합니다.앞으로연산자(또는 "술어"). 그러므로 "xargs"를 쉽게 이용할 수 없습니다.
감사해요강철 드라이버그의 대답을 위해. stat
처음부터 시작하면 그의 사용이 해결책이 될 것이라고 생각합니다 . 안타깝게도 find
출력을 다른 시스템(특히 's를 사용하여)에서 생성된 유사한 정보와 비교 해야 합니다 printf
.
find
제가 찾은 효과적인 코딩 관용구는 다음과 같습니다 .
# Option 1
Some Command \
| xargs -n 1 -I{} find {} -printf '%p\t%TY-%Tm-%Td %TH:%TM\t%s\n'
# Option 2
Some Command | tr '\n' '\0' \
| xargs -0 -I{} find {} -printf '%p\t%TY-%Tm-%Td %TH:%TM\t%s\n'
기반으로무루의find
코멘트, 이것은 Cygwin의 Gnu 버전이 4.9보다 이전이고 조건자를 인식하지 못하기 때문에 아직 작업을 시작하지 않은 코드 관용구입니다 -files0-from
.
Some Command | tr '\n' '\0' \
| find -files0-from - -printf '%p\t%TY-%Tm-%Td %TH:%TM\t%s\n'
답변1
내가 아는 한, 이는 1의 GNU 구현에서는 해당되지 ls
않지만 stat
.
예를 들어 stat
, GNU Coreutils는 stat --printf '%n\t%y\t%s\n'
필요한 필드와 구분 기호를 제공하지만 (내가 아는 한) 날짜/시간 형식에 대한 세부적인 제어 기능은 제공하지 않습니다.
그러나 zsh
이것이 옵션인 경우 다음을 사용할 수 있습니다.zsh/stat 모듈, 원하는 정확한 출력으로 자신만의 쉘 함수를 정의할 수도 있습니다.
zmodload -F zsh/stat b:zstat
mystat () {
local f s ret=0
for f do
zstat -n -LF '%Y-%m-%d %H:%M' -H s -- $f &&
printf '%s\t%s\t%s\n' $s[name] $s[mtime] $s[size] ||
ret=$?
done
return $ret
}
또는 간단한 Perl 스크립트를 사용하여 원하는 것을 달성할 수 있습니다.lstat 기능, 예를 들어
mystat() {
perl -MPOSIX -E '
foreach $f (@ARGV) {
if (@s = lstat($f)) {
say join "\t", $f, strftime("%Y-%m-%d %H:%M", localtime($s[9])), $s[7];
} else {
warn "$f: $!\n";
$ret = 1;
}
}
exit $ret;
' -- "$@"
}
그럼에도 불구하고 이는 -printf
GNU 구현에만 해당됩니다( find
GNU 명령이 추가되기 수십 년 전에 존재했지만). stat
GNU find
4.9 이상에서는 조건자를 사용하여 임의의 경로 목록을 안정적으로 전달할 수 있습니다 -files0-from
.
mystat() {
[ "$#" -eq 0 ] ||
printf '%s\0' "$@" |
find -files0-from - -prune -printf '%p\t%TY-%Tm-%Td %TH:%TM\t%s\n'
}
어떤 경우든 TAB 및 NL은 파일 경로의 모든 문자만큼 유효하므로 출력을 안정적으로 구문 분석할 수 없습니다(단순화할 수 있는 타임스탬프 형식 %F %R
도 시간대 정보가 부족하기 때문에 모호합니다).
이들 모두는 lstat()
파일에 대한 작업을 수행하므로 해당 유형의 경우심볼릭 링크이는 최종적으로 확인되는 파일이 아니라 기호 링크 자체에 대한 정보를 보고합니다. 대신 이 작업을 수행 하려면 (심볼릭 링크가 해결된 후 정보를 보고하려면) GNU 또는 GNU 에 stat()
옵션을 추가하고 zsh stat에서 제거하고 ast-open에 대한 옵션을 제거한 후 script에서 바꾸십시오 .-L
stat
find
-P
ls
lstat
stat
perl
¹ 중완전 개방ls -PdZ '%(name)s\t%(mtime:time=%Y-%m-%d %H:%M)s\t%(size)s' -- "$@"
(와 동일한 구문 이지만 구현됨 )표준 pax
명령 의 경우) 그러나 내가 아는 한, 그 항목은 더 이상 유지되지 않습니다.
² GNU는 stdin에서 실행하는 것을 의미하는 것으로 해석하기 때문에 stat
호출된 파일에서도 실패합니다 . zsh (GNU보다 몇 년 앞선)에는 이 문제가 없으며 임의의 파일 설명자에서 실행될 수 있습니다.-
fstat()
stat
-f FD
fstat()