인쇄할 수 없는 문자만 포함된 파일을 찾는 방법이 있습니까?

인쇄할 수 없는 문자만 포함된 파일을 찾는 방법이 있습니까?

내 프로그램이 제대로 실행되지 않고 인쇄할 수 없는 문자 몇 개만으로 많은 파일을 생성합니다. 이 파일을 가져오면 아무것도 표시되지 않습니다(인쇄할 수 없는 문자이기 때문에). 그러나 -empty또는 같은 명령을 사용하면 -size 0파일이 표시되지 않습니다 find.

인쇄할 수 없는 문자만 포함된 파일을 검색하는 방법을 아는 사람이 있습니까?

답변1

GNU grep(및 기타 여러 grep 구현)을 사용하면 인쇄 가능한 문자가 포함되지 않은 파일을 검색할 수 있습니다. 이 -L옵션은 일치 항목이 포함되지 않은 파일을 나열한다는 의미입니다. [[:print:]](예, 두 쌍의 괄호가 있습니다) 인쇄 가능한 문자와 일치합니다. 인쇄 가능한 문자의 정의는 로케일에 따라 다릅니다.

grep -L '[[:print:]]' -- *

여기에는 빈 파일(예:민다스는 지적했다.).

이를 제거하려면( grep먼저 출력을 보고 올바른 파일이 제거되었는지 확인하십시오) 파일 이름에 개행 문자가 포함되어 있지 않다고 가정합니다.

grep -L '[[:print:]]' -- * |
while IFS= read -r filename; do
  if [ -f "$filename" ] && [ -s "$filename" ]; then
    rm "$filename"
  fi
done

또는 이에 상응하는 것(빈 파일도 제거된다는 점에 유의하세요)

set +f; IFS='
' # split at newlines, turn off globbing
rm -- $(set -f; grep -L '[[:print:]]' -- *)
set -f; unset IFS

위의 명령은 현재 디렉터리에 하위 디렉터리가 있는 경우 오류 메시지를 생성합니다(디렉토리를 호출할 것이므로 rm호출하지 마세요 rm -r!). zsh에서는 *(.L+0)대신 비어 있지 않은 일반 파일을 일치시킬 수 *있으며 파일 이름의 특수 문자(개행 제외)에 대해 걱정할 필요가 없습니다.

IFS=$'\n'
rm -- $(grep -L '[[:print:]]' -- *(.))
unset IFS

POSIX 도구만 사용하여 grep -l '[[:print:]]' -- *보관하려는 파일을 표시합니다(빈 파일 제외).

또는 파일을 반복할 수 있습니다. 이는 더 깨끗하고 확실히 특수 문자에 문제를 일으키지 않지만(점 파일을 건너뜁니다) 이론적으로는(측정 가능하지는 않지만) 느립니다.

for x in *; do
  if [ -f "$x" ] && [ -s "$x" ] && ! grep -q '[[:print:]]' <"$x"; then
    rm -- "$x"
  fi
done

답변2

가장 좋은 방법은 다음을 사용하는 것입니다 file.

find . -type f -exec file {} + | grep ": data"

이제 이것은 처음에 올바른 매직 번호를 갖는 파일을 무작위로 포착하지 못하지만 어쨌든 대부분의 다른 방법에서는 해당 파일을 놓칠 가능성이 높습니다.

이러한 파일을 찾는 다른 방법:

  • 마지막 수정: find -mmin 5= 5분 전
  • 크기(0일 필요는 없음): find -size -4k= 4096바이트 미만

관련 정보