Linux 명령줄을 사용하여 다른 확장의 모든 하위 디렉터리에서 일치하는 파일을 삭제하는 가장 쉬운 방법은 무엇입니까?

Linux 명령줄을 사용하여 다른 확장의 모든 하위 디렉터리에서 일치하는 파일을 삭제하는 가장 쉬운 방법은 무엇입니까?

나는 탐색하고 답을 찾으려고 노력했습니다. 가장 짧은 문자 수로 이 작업을 수행하면 보너스 포인트가 주어집니다.

그래서 file1.ex1 file2.ex1 file1.ex2는 있지만 file2.ex2는 없습니다.

모든 ex1 파일을 삭제하고 싶지만 ex2 버전이 먼저 존재하는 경우에만 가능합니다.

따라서 이는 유지하려는 확장자로 끝나는 모든 파일의 디렉토리 목록을 가져와서 파이프하고 파일 이름의 첫 번째 부분과 일치하는 파일을 검색한 다음 삭제 명령으로 파이프해야 함을 의미한다고 생각합니다.

저는 unraid에서 이 작업을 하고 있기 때문에 표준 Linux fu를 사용하고 싶습니다.

나는 이것이 대부분의 사람들에게 쉬울 것이라는 것을 알고 있습니다. 그래서 최소한의 문자 수로 완료해야 하는 도전 과제를 추가했습니다! 아, 이는 해당 하위 디렉터리의 콘텐츠에만 일치하는 모든 하위 디렉터리에 대해 작동합니다.

감사해요!

마살렉

답변1

find . -name "*.ex1" -type f -exec sh -c '[ -f "${1%1}2" ] && echo rm "$1"' sh {} \;

이는 현재 디렉토리에서 접미사가 있는 모든 일반 파일을 재귀적으로 찾고 .ex1발견된 각 파일( )에 대해 작은따옴표로 묶인 쉘 스크립트를 실행합니다 $1. 단지 rm실행할 명령을 인쇄합니다 .

  • [ -f "${1%1}2" ] &&매개변수가 $1존재하고 2마지막 문자인지 테스트합니다. ${1%1}마지막 것을 삭제 1하고 2. 파일이 존재하는지 테스트 [ -f ... ] &&하고 조건이 true이면 다음 명령을 실행합니다.

명령을 삭제 echo하고 다시 실행하여 파일을 실제로 삭제할 수 있습니다.

하위 디렉터리의 파일은 삭제하지 않고 현재 디렉터리의 파일만 삭제하려는 경우:

for i in *.ex1; do [ -f "${i%1}2" ] && echo rm "$i"; done

echo다시 한번 실행 하려면 삭제해야 합니다 rm.

관련 정보