찾기를 사용하여 목록을 비교하는 방법은 무엇입니까?

찾기를 사용하여 목록을 비교하는 방법은 무엇입니까?

나는 이렇게 했고 많은 중복 백업 파일을 제거하고 싶은 파일 목록을 얻었습니다.

find . -type f -name '._*' 

해당 파일 이름을 가진 파일을 찾고 싶습니다

  • /home/masi/._test.tex성냥/home/masi/test.tex
  • /home/masi/math/lorem.png성냥/home/masi/math/._lorem.png

저장할 파일의 의사 코드에 해당 filename하는 것이 있지만 역시 저장 ._filename되지 filename않습니다 .._filename

find . -type f -name '._*' -exec \ 
   find filenameWithoutDotUnderscore, if yes, print the filename

의사코드 2 삭제할 파일 설명 = ._filename해당 파일 존재 여부filename

  • 및 가 동일한 디렉토리에 존재하는 경우 filename중복된 =를 제거할 수 있도록 인쇄하십시오.._filename._filename._filename
  • filenamePart1_.filenamePart2, , ... bok_3A.pdf에 있는 것을 제외합니다 .._filename
  • 동일한 디렉토리에 해당 항목이 없으면 ._filename삭제하지 마십시오.filename

와일드카드를 확인하는 명령

이렇게 했는데 find . -type f -name '._*' -exec sh -c 'for a; do f="${a%/*}/${a##*/._}"; [ -e "$f" ] && printf "rm -- %s\n" "$a"; done' find-sh {} +너무 많은 파일이 반환되었습니다. &&존재확인 외에 조건( )이 더 필요한 것 같습니다 [ -e "$f" ]. 큰 차이가 있다고 의심된다면 여기에서 몇 가지 내용을 비교한 다음 마지막에 비교하는 것이 좋습니다.

시스템: Ubuntu 16.04 및 Debian 8.25
Bash: 4.3.42
찾기: 4.7.0

답변1

를 사용하여 이 작업을 수행할 수 있지만 find이를 강력하게 수행하려면 쉘 단일 라이너도 포함해야 합니다. 이를 수행하는 올바른 방법은 다음 중 하나입니다.

결과 셸에 루프를 채웁니다.

find . -type f -name '._*' -exec sh -c 'for a in "$@"; do f="${a%/*}/${a##*/._}"; [ -e "$f" ] && printf %s\\n "$f"; done' find-sh {} +

또는 테스트할 각 파일에 대해 별도의 셸을 생성합니다(비효율적이지만 잠재적으로 더 읽기 쉬움).

find . -type f -name '._*' -exec sh -c 'f="${1%/*}/${1##*/._}"; [ -e "$f" ] && printf %s\\n "$f"' find-sh {} \;

백업 파일을 직접 삭제하려면 다음과 같이 변경하세요.시험 실행:

find . -type f -name '._*' -exec sh -c 'for a; do f="${a%/*}/${a##*/._}"; [ -e "$f" ] && printf "rm -- %s\n" "$a"; done' find-sh {} +

그 다음에일단 만족하면인쇄된 명령 목록을 보려면 다음을 사용하십시오.

find . -type f -name '._*' -exec sh -c 'for a; do f="${a%/*}/${a##*/._}"; [ -e "$f" ] && rm -- "$a"; done' find-sh {} +

노트:

이들 모두에서 find-sh매개변수는 임의의 문자열입니다. 여기에 무엇이든 넣을 수 있습니다. 이는 $0생성된 셸에 설정되며 오류 보고에 사용됩니다.

for a in "$@"; do와 완전히 동일합니다 for a; do.

printf비교하다echo.

인용문이 중요해요.

관련 정보