이 명령을 어떻게 단축할 수 있나요? 목표는 파일 이름이 일치하는 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
-a
find
의 부울 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