폴더에 여러 개의 파일이 있고 모두 1, 2, 3 등과 같이 서로 다른 버전 번호로 끝납니다. 그들 중 일부는 확장 기능을 가지고 있고 일부는 그렇지 않습니다. ls, find 또는 grep과 같은 명령을 사용하여 확장자로 끝나거나 끝나지 않을 수 있는 특정 문자(예: "1")로 끝나는 모든 파일을 나열할 수 있는 방법이 있습니까?
예를 들어, 한 디렉토리에 다음 과 같은 파일이 있습니다: sum 을 반환 ver1.txt
하지만 도움이 되는 경우 sum 을 반환하지 않는 작업을 수행하고 싶습니다 . 비슷한 것을 사용해 보았지만 원하는 효과가 없습니다 ...ver1
file.1
ver1.txt
ver1
file.1
ls *[1.]*
답변1
존재할 수 있는 모든 파일 이름과 검색할 수 있는 모든 패턴의 예를 제공할 수는 없으므로 다음과 같은 정보를 사용하겠습니다.
find . -type f | awk -F / '{print $2}' | grep -v '\.[1-100]$'
ver1.txt
, ver1
및 을 file.1
검색하려는 디렉터리의 파일로 지정했다는 점을 고려하면 위 명령은 원하는 출력을 반환합니다.
ver1.txt
ver1
각 부분을 설명하세요.
find . -type f
현재 디렉터리의 모든 파일을 반환합니다.
awk -F / '{print $2}'
./
명령 에 나타나는 각 파일의 시작 부분을 삭제합니다.find
grep -v '\.[1-100]$'
.#
where 에서 #
숫자로 끝나지 않는 모든 파일을 반환합니다 1-100
. 스위치는 v
일치하지 않는 행을 찾습니다. 제공된 예제의 경우 이스케이프를 사용 하고 문자열 주위에 작은따옴표를 사용해야 .#
합니다 . 이 문자열로 끝나는 파일을 나타내지만 , 귀하의 경우 이 문자열 없이도 작동합니다. 파일 이름의 다른 위치에 파일이 있을 수 있는 경우에만 포함합니다 .\
.
$
.
찾고 있는 항목에 따라 매개변수를 변경해야 하지만 이렇게 하면 시작됩니다.
답변2
순수한 find
:
find . -regex '\.[^.]*1\|.*1\.[^.]*'
이것은 일치 ver1
하고 ver1.txt
그리고 file1.ver1.txt
그러나아니요 file1.ver2.txt
. 또한 일치시키려는 경우:
find . -regex '\.[^.]*1\|.*1\..*'
검색 디렉터리에서 이러한 명령을 실행해야 find somepath ...
하지만 정규식이 전체 경로와 일치하기 때문에 작동하지 않습니다.