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
와일드카드 플래그는 버전 과 마찬가지로 숨겨진 파일과 숨겨진 디렉터리의 파일을 포함한 .
일반 파일만 필터링합니다 . 는D
find
(#i)
와일드카드 플래그이렇게 하면 패턴의 나머지 부분이 대소문자를 구분하지 않게 됩니다.
print -lr
print -lr --
인수를 한 줄에 하나씩 인쇄합니다(첫 번째 인수가 대시로 시작하는 경우 해당 인수를 인쇄합니다). 두 가지를 결합하여 최신 파일을 얻으세요.
print -lr src/**/(#i)*.py(D.om[1,10])
실제로는 로 단축할 수 있습니다 print -lr src/**/*.py(om[1,10])
.
zsh에서는 아마도 이것이 필요하지 않을 것입니다. 왜냐하면 파일 목록을 얻을 때 적어도 파일 목록이 모두 단일 스키마에서 나온 경우 정렬할 수 있기 때문입니다. 이는 showLatest
임의의 파일 목록을 처리할 수 있는 zsh에서 구현된 메서드입니다 . 불행하게도 om
glob 한정자는 단일 패턴에만 적용될 수 있으며 단일 패턴은 단일 디렉터리나 트리의 파일과만 일치할 수 있습니다. 이 문제를 해결하는 방법은 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}
마지막 매개변수