ousjgforuigor-TIMESTAMP.txt와 같은 이름을 가진 수천 개의 파일이 있는 폴더가 있습니다.
타임스탬프는 표준 Unix 타임스탬프(예: 1543932635)입니다. 파일 이름 타임스탬프가 > 제공된 파일만 나열하는 쉬운 방법이 있습니까?
타임스탬프 앞의 문자 수는 가변적이지만 이름은 항상 -TIMESTAMP.txt로 끝납니다.
이를 위해 bash 스크립트를 작성할 수 있지만 이는 과도한 것 같습니다.
답변1
t=1543951252 zsh -c 'datefilter() { ts=${REPLY##*-}; ts=${ts%*.txt}; ((ts >= $t)) }; print -l *-<->.txt(+datefilter)'
전체 명령은 (끝까지) print -l
각 매개변수를 별도의 줄에 인쇄한다는 것입니다. 음,포괄적인명령은 zsh
환경 변수를 t
주어진 값으로 설정하는 가상의 bash 셸 호출입니다. 파일 이름을 인쇄하는 대신 배열에 넣거나 삭제하거나 다른 작업을 수행할 수 있습니다.
glob 한정자는 *-<->.txt
일치할 수 있는 파일 이름을 선택합니다. 파일 이름은 아무 것이나( *
)로 시작하고 대시( -
), 숫자 범위(zsh의 범위 연산자 <->
), 마지막으로 .txt
; 그런 다음 globbing은 (+datefilter)
해당 함수에 대한 호출인 glob qualifier로 전송됩니다 .
이 datefilter
함수는 (in)에 전달된 파일 이름을 가져와 $REPLY
타임스탬프 값으로 자릅니다. 타임스탬프 값이 에 지정된 타임스탬프보다 크거나 같으면 true를 반환합니다 t
. 이 테스트에 성공한 파일은 파일 이름으로 유지되며 나머지는 삭제됩니다.
glob을 수동으로 반복하여 bash에서 비슷한 작업을 수행할 수 있습니다.
for f in *-*.txt
do
ts=${f##*-}
ts=${ts%.txt}
[[ ts -ge t ]] && printf '%s\n' "$f"
done
bash 와일드카드는 *
길잃은 파일 이름을 선택할 수 있지만, 예를 들어 foo-bar.txt
숫자 bar
가 필요하지 않습니다. 그렇지 않으면 다음과 같은 몇 가지 가정을 하드코딩해야 합니다.
for f in *-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9].txt; do # ...
또는
for f in *-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]*.txt; do # ...
대시와 마침표 사이에 특정 자릿수가 나타나도록 합니다.