![인쇄할 수 없는 문자만 포함된 파일을 찾는 방법이 있습니까?](https://linux55.com/image/21417/%EC%9D%B8%EC%87%84%ED%95%A0%20%EC%88%98%20%EC%97%86%EB%8A%94%20%EB%AC%B8%EC%9E%90%EB%A7%8C%20%ED%8F%AC%ED%95%A8%EB%90%9C%20%ED%8C%8C%EC%9D%BC%EC%9D%84%20%EC%B0%BE%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%B4%20%EC%9E%88%EC%8A%B5%EB%8B%88%EA%B9%8C%3F.png)
내 프로그램이 제대로 실행되지 않고 인쇄할 수 없는 문자 몇 개만으로 많은 파일을 생성합니다. 이 파일을 가져오면 아무것도 표시되지 않습니다(인쇄할 수 없는 문자이기 때문에). 그러나 -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바이트 미만