"ls"는 "find" 연산자 "-printf"에 해당합니까?

"ls"는 "find" 연산자 "-printf"에 해당합니까?

이 명령에는 발견된 각 파일/폴더에 대해 사용자가 지정한 메타데이터를 인쇄하는 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;
  ' -- "$@"
}

그럼에도 불구하고 이는 -printfGNU 구현에만 해당됩니다( findGNU 명령이 추가되기 수십 년 전에 존재했지만). statGNU find4.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에서 바꾸십시오 .-Lstatfind-Plslstatstatperl


¹ 중완전 개방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 FDfstat()

관련 정보