안녕하세요. 시리즈 ABC1*, ABC12* 및 ABC13* ABC14* 시리즈 등으로 시작하는 파일 목록이 있습니다.
find 명령을 사용하여 ABC12* 및 ABC13* 목록을 가져오고 싶습니다.
다음 명령어를 사용하고 있는데 정확한 결과를 추출할 수 없습니다..
ls -ltr |grep -e "ABC12" |find . -type f -mtime 15
답변1
-name
옵션 검색 모드. 대괄호는 OR의 내용을 의미합니다.
find . -type f -name 'ABC1[23]*'
답변2
이 -mtime 15
뜻 은 참고하세요"다음 24시간 단위로 반올림한 나이는 15세입니다.", 즉 14*24
몇 시간 전에 15*24
수정된 파일 입니다.하늘많은 시간대와 마찬가지로 연간 하루 23시간과 하루 25시간이 있습니다. 이것이 당신이 원하는 것이라고 가정하고 를 사용하여 zsh
다음을 수행할 수 있습니다.
ls -lrtd -- **/ABC1[23](D.m15)
또는:
find . -type f -name 'ABC1[23]' -mtime 15 -exec ls -lrtd {} +
그러나 파일 수가 명령에 전달된 매개 변수와 환경의 최대 크기를 초과하면 첫 번째 파일이 실패하고, 두 번째 파일을 사용하면 ls
여러 인스턴스가 실행되므로 목록이 시간순으로 정렬되지 않습니다. 요청대로 -t
.
zsh
GNU를 사용하면 ls
다음과 같이 이 문제를 해결할 수 있습니다.
autoload zargs
zargs -- **/ABC1[23](D.m15Om) -- ls -lUd
즉, zsh
필요에 따라 목록을 정렬하여 하나 이상의 호출에 전달하되 목록을 정렬하지 말라고 알려줍니다. 다른 구현의 경우 쓸모는 없지만 무해한 다른 정렬로 대체하여 수행하도록 할 수 있습니다.ls
ls
ls
U
rt
ABC17
, , with ABC23
대신 ->와 같은 범위를 원한다면 다음과 같이 하면 됩니다.ABC12
ABC13
zsh
ls -lrtd -- **/ABC<17-23>(D.m15)
(그러나 ABC<17-23>
일치 는 ABC17
일치하지 않습니다 ABC0000017
. 이것이 문제인 경우 (glob 연산자에는 옵션이 필요 하지만) <17-23>
로 변경하여 2자리 숫자만 일치하는지 확인하거나 앞에 0이 있는 숫자를 제외하십시오.(<17-23>~^??)
extendedglob
pattern~exclude
(<17-23>~0*)
파일 이름인 경우시작상대적인ABC12
예 ABC12
, 그렇다면 당신은 할 것입니다
ls -lrtd -- **/ABC<17-23>*(D.m15)
하지만 이는 ABC170에서도 일치한다는 점에 유의하세요. 이를 방지하려면:
setopt extendedglob
ls -lrtd -- **/ABC<17-23>^[0-9]*(D.m15)
즉, <17-23>
십진수로 시작하지 않는 모든 항목이 뒤에옵니다.
이에 상응하는 내용 find
(앞에 0을 허용하지 않고 많은 수의 파일에 대해 위의 문제가 있고 파일 이름에 유효하지 않은 문자가 포함되어 있고 ./
모든 파일에 접두사가 있는 경우 잠재적인 문제가 있음에도 불구하고) 때때로 다음과 같습니다.
find . \( -name 'ABC1[7-9]*' -o -name 'ABC2[0-3]*' \) \
! -name 'ABC??[0-9]*' -mtime 15 -type f \
-exec ls -lrtd {} +