두 가지 패턴이 주어지면 특정 디렉터리를 검색하고 각 패턴과 일치하는 마지막 세 개의 파일 이름을 인쇄합니다.

두 가지 패턴이 주어지면 특정 디렉터리를 검색하고 각 패턴과 일치하는 마지막 세 개의 파일 이름을 인쇄합니다.

이 명령을 어떻게 단축할 수 있나요? 목표는 파일 이름이 일치하는 ABC폴더에 가장 최근 파일 3개를 표시한 다음 파일 이름이 일치하여 uvw동일한 작업을 수행하는 것 입니다.xyz

앞으로 검색할 문자열을 더 추가해야 하므로 이 길이를 줄이고 싶습니다.

find . -name 'ABC' | xargs ls | grep -i uvw |sort| tail -n 3; find . -name 'ABC' | xargs ls | grep -i xyz |sort| tail -n 3

출력 예:

2018-06-23T01-23-56.919Z-UVW.gz
2018-06-23T01-29-56.556Z-UVW.gz
2018-06-23T23-26-14.463Z-UVW.gz
2018-08-08T00-16-22.923Z-xyz.js
2018-08-08T00-16-24.517Z-xyz.js
2018-08-08T00-16-25.427Z-xyz.js

답변1

그리고 zsh:

set -o extendedglob # best in ~/.zshrc
for w (uvw xyz) printf '%s\n' **/ABC/(#i)*$w*(D[-3,-1]:t)
  • **/: 모든 수준의 하위 디렉터리
  • (#i): 대소문자를 구분하지 않고 다음과 일치합니다.
  • (D[-3,-1]:t): 글로벌 예선
  • D: 숨겨진 파일을 포함하고 find다음과 같은 숨겨진 디렉터리를 봅니다.
  • [-3,-1]:마지막 3개만 선택합니다(글로브는 기본적으로 어휘 순서로 정렬됩니다).
  • :t:수정자추출됨꼬리귀하와 같은 파일 경로(기본 이름) ls.

ABC 디렉터리가 여러 개 있는 경우 해당 디렉터리의 이름이 정렬에 영향을 미칩니다. 의 파일이 a/ABC의 파일보다 먼저 나타납니다 b/ABC.

답변2

그러면 일치하는 모든 파일이 검색됩니다.어느이 스니펫은 다음과 같습니다.

for fragment in ABC UVW xyz; do 
    find . -name "\*${fragment}\*" | sort | tail -n3; 
done

일치하는 파일을 찾고 싶다면모두그중에서도 다음과 같이 할 수 있습니다.

find . -name '*ABC*' -a -name '*xyz*' | sort | tail -n3

-afind의 부울 AND 연산자는 입니다 .

BSD의 경우 및 대신 및 를 find사용하십시오 .-or-and-o-a

답변3

가장 많이 찾고 계시는

find . -iregex '.*/ABC/[^/]*uvw.*' | sort | tail -n3

작동 방식은 다음과 같습니다.

  • -iregex대소문자 구분 모드 검색
  • .*/ABC/모든 깊이에서 디렉터리 ABC(dir의 전체 이름)를 찾습니다.
  • [^/]*uvw.*dir 이름 바로 뒤에는 문자열을 포함하는 파일 이름이 ABC오고 그 사이에는 하위 디렉터리가 없습니다.uvw

그리고 sort부분적으로 tail영향을 받지 않습니다.

다른 패턴을 추가하려면 필요한 모든 문자열로 이 명령을 반복해야 합니다. 또는 파일이 3개만 필요한 경우 파일이 어떤 그룹에 속해 있는지에 관계없이 모든 것을 하나의 명령으로 결합할 수 있습니다.

find . -iregex '.*/ABC/[^/]*\(uvw\|xyz\)[^/]*' | sort | tail -n3

답변4

Bash 스크립트의 for 루프를 사용하여 원하는 것을 얻었습니다. 명령줄에서 이 작업을 수행할 수 있습니까?

#!/bin/bash
for i in ABC DEF
do
  for j in uvw xyz
  do
    x=`find . -iname $i | xargs ls | grep -i $j | sort | tail -n 3`
    echo "$x"
  done
done

관련 정보