나는 이렇게 했고 많은 중복 백업 파일을 제거하고 싶은 파일 목록을 얻었습니다.
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
.