find의 출력을 다른 find로 파이프하는 방법

find의 출력을 다른 find로 파이프하는 방법

find발견된 파일을 수정시간을 기준으로 정렬하는 방법을 검색하던 중 ,이 답변다음 주문을 제공합니다.

find . -type f -printf '%T@ %p\n' | sort -k 1nr | sed 's/^[^ ]* //' | head -n 10

위의 문제는 내가 기억할 수 없고 find적용하기로 선택한 매개변수를 사용하여 내 호출을 통해 제공할 수 있도록 이를 쉘 스크립트로 패키징하는 방법을 찾을 수 없다는 것입니다. 예를 들어, showLatest다음을 수행할 수 있도록 위의 내용을 쉘 스크립트 "" 형식으로 패키징하려면 어떻게 해야 합니까 ?

find src -type f -iname \*.py | showLatest 10

답변1

zsh에서는 패턴의 끝 부분 showLatest 10에 있습니다 . (om[1,10])이것들은 모두글로벌 예선; om수정 시간을 기준으로 정렬하고(가장 어린 것부터) [1,10]처음 10개 일치 항목을 선택합니다.

find src -type f -iname \*.py예 ( 본인에 넣으려면 먼저 실행 print -lr src/**/(#i)*.py(D.)해야 합니다 ).setopt extended_glob~/.zshrc

와일드카드 플래그는 버전 과 마찬가지로 숨겨진 파일과 숨겨진 디렉터리의 파일을 포함한 .일반 파일만 필터링합니다 . 는Dfind(#i)와일드카드 플래그이렇게 하면 패턴의 나머지 부분이 대소문자를 구분하지 않게 됩니다.

print -lrprint -lr --인수를 한 줄에 하나씩 인쇄합니다(첫 번째 인수가 대시로 시작하는 경우 해당 인수를 인쇄합니다). 두 가지를 결합하여 최신 파일을 얻으세요.

print -lr src/**/(#i)*.py(D.om[1,10])

실제로는 로 단축할 수 있습니다 print -lr src/**/*.py(om[1,10]).

zsh에서는 아마도 이것이 필요하지 않을 것입니다. 왜냐하면 파일 목록을 얻을 때 적어도 파일 목록이 모두 단일 스키마에서 나온 경우 정렬할 수 있기 때문입니다. 이는 showLatest임의의 파일 목록을 처리할 수 있는 zsh에서 구현된 메서드입니다 . 불행하게도 omglob 한정자는 단일 패턴에만 적용될 수 있으며 단일 패턴은 단일 디렉터리나 트리의 파일과만 일치할 수 있습니다. 이 문제를 해결하는 방법은 glob 한정자를 사용하여 일치 결과에 임의의 목록을 삽입하는 것 e입니다 . +그런 다음 정렬을 수행하기 위해 glob 한정자가 적용됩니다 o. 내장 한정자는 e/ +재정의된 결과에 영향을 미치지 않지만 사용자 지정 한정자( oe또는 o+)는 영향을 미칩니다(zsh 5.0.5부터).

#!/usr/bin/env zsh
zmodload zsh/stat
files=("${(@f)$(<&0)}")
print -lr .(e\''reply=($files)'\'noe\''stat -A REPLY +mtime -- $REPLY'\')

답변2

이 스크립트는 나에게 효과적입니다.

#!/bin/bash
#
while IFS= read -r line; do
  find "$line" -printf '%T@ %p\n'
done | sort -k 1nr | sed 's/^[^ ]* //' | head -n 10

다음을 통해 파이프할 수 있습니다 find.

(0)asus-romano:~/tmp% find . -type f | ./script11.sh
./script11.sh
./script10.sh
[...]

zsh훨씬 빠른 전역 별칭을 사용할 수 있지만 그런 것은 없는 것 같습니다 bash.

(0)asus-romano:~/tmp% alias -g showlast10="-printf '%T@ %p\n' | sort -k 1nr | sed 's/^[^ ]* //' | head -n 10"
(0)asus-romano:~/tmp% find . -type f showlast10
./script11.sh
./script10.sh
./Just  tab.xyz
[...]

답변3

우선, 유사한 스크립트를 작성 showLatest하고 find사용하는 것이 확실히 가능합니다. 하지만 그러면 각 파일을 두 번 확인해야 합니다.

따라서 이것이 마지막 질문에 대한 답변은 아니지만 먼저 설명된 문제를 해결해야 합니다. 즉, 조회할 유연한 인수 목록을 제공하는 방법입니다.

sfind.sh:

#!/bin/bash
find "${@:1:$[$#-1]}" -printf '%T@ %p\n' | sort -k 1nr | sed 's/^[^ ]* //' | head -n ${@:$#:1}

일반적인 호출은 입니다 sfind.sh [find-parameters] count.sfind.sh src -type f -iname \*.py 10

설명하다:

  • $@스크립트에 전달된 매개변수 목록을 포함합니다.
  • $#$@의 길이입니다.
  • ${@:1:$[$#-1]}마지막 매개변수를 제외한 모든 매개변수
  • ${@:$#:1}마지막 매개변수

관련 정보