파일 이름의 문자열 타임스탬프를 기준으로 파일 필터링

파일 이름의 문자열 타임스탬프를 기준으로 파일 필터링

ousjgforuigor-TIMESTAMP.txt와 같은 이름을 가진 수천 개의 파일이 있는 폴더가 있습니다.

타임스탬프는 표준 Unix 타임스탬프(예: 1543932635)입니다. 파일 이름 타임스탬프가 > 제공된 파일만 나열하는 쉬운 방법이 있습니까?

타임스탬프 앞의 문자 수는 가변적이지만 이름은 항상 -TIMESTAMP.txt로 끝납니다.

이를 위해 bash 스크립트를 작성할 수 있지만 이는 과도한 것 같습니다.

답변1

사용glob 한정자로 zsh 표현식,

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 # ...

대시와 마침표 사이에 특정 자릿수가 나타나도록 합니다.

관련 정보