\n
내용이 정확히 1개 (개행 문자)인 실패한 실험 결과 파일이 있습니다 .
파일이 무엇인지 이해하고 삭제하기 위해 파일을 모두 나열하고 싶습니다(아마도 find
비슷한 것을 사용하여).grep
답변1
.
검색 경로 외부에 참조 파일을 만듭니다( 예제에 있음 ).
echo >/tmp/reference
이제 찾고 있는 파일과 동일한 알려진 파일이 있습니다. 그런 다음 .
검색 경로(여기) 아래의 모든 일반 파일을 참조 파일과 비교합니다.
find . -type f -size 1c -exec cmp -s -- /tmp/reference {} \; -print
-size 1c
필수는 아니며 생략할 수도 있습니다. 단지 성능을 향상시키기 위한 것입니다. 이는 추가 프로세스를 생성하지 않고 잘못된 크기의 파일을 거부하는 빠른 예비 테스트입니다. cmp …
상대적으로 비용이 많이 드는 프로세스는 적절한 크기의 파일에 대해서만 생성됩니다.
-s
침묵 cmp
하다. 출력은 필요 없고 종료 상태만 필요합니다.
--
설명은 다음과 같습니다."--"(이중 대시)은(는) 무슨 뜻인가요?이 예에서는 실제로 필요하지 않습니다. 즉, 참조 파일이 로 지정되고 /tmp/reference
검색 경로가 이면 누군가 실수로 잘못된 동작이나 실패를 유발할 수 있는 .
경로를 선택하는 것을 방지하기 위해 사용합니다 --
.cmp
--
-exec
테스트로 사용하면 테스트된 파일에 대해 종료 상태가 0인 경우에만 성공합니다 cmp
. 파일이 와 일치하면 참조 파일과 동일한 파일의 경로 이름이 제공됩니다 /tmp/reference
.find
이 방법은 고정된 콘텐츠가 있는 파일을 찾는 데 사용할 수 있습니다. 정확한 콘텐츠가 포함된 참조 파일만 있으면 됩니다( -size …
사용할 경우 조정하는 것을 잊지 마세요. -size "$(</tmp/reference wc -c)c"
편리할 것입니다). 우리의 특별한 경우에는 echo
간단한 방법을 사용하여 정확히 원하는 개행 문자를 인쇄하기 때문에 파일을 생성합니다.
find
일치하는 모든 파일을 삭제하려면 다음을 사용하세요 .-delete
(XOR -exec rm -- {} +
)뒤쪽에 -print
.
답변2
단일 바이트 파일을 검색합니다. 알려진 값과 비교하십시오. 일치하는 경우 인쇄 및/또는 삭제
find /path/to/files -type f -size 1c -exec sh -c 'printf "\n" | cmp -s -- - "$1"' _ {} \; -print
자동으로 실행하려면 -delete
삭제에 추가를 선택한 다음 삭제를 선택하면 됩니다.-print
답변3
GNU를 사용하면 전체 파일을 한 줄로 처리 grep
할 수 있습니다 (NUL을 줄 종결자로 사용하여 파일에 실제로 NUL이 포함되어 있지 않은 한 전체 파일을 한 줄로 처리하는 효과가 있습니다). 이것을 파일 이름만 인쇄하고 PCRE에 사용하는 것과 결합하면 다른 것은 아무것도 없이 하나만 사용하여 "줄"을 검색할 수 있습니다 .-z
-z
grep
\0
-l
-P
\n
\n
grep -lPz '^\n$' *
예를 들어 다음 세 가지 파일이 있다고 가정합니다.
printf 'foo\n' > good_file_1
printf '\n\n\n\n' > good_file_2
printf '\n' > bad_file
grep
위를 실행하면 다음이 제공됩니다.
$ grep -lPz '^\n$' *
bad_file
globstar
bash 옵션(man의)을 사용하여 재귀적으로 만들 수도 있습니다 bash
.
글로벌 스타
설정된 경우 경로 이름 확장 컨텍스트 **에 사용된 패턴은 모든 파일과 0개 이상의 디렉터리 및 하위 디렉터리와 일치합니다. 패턴 뒤에 /가 오면 디렉터리와 하위 디렉터리만 일치합니다.
예를 들어, 이 경우:
$ mkdir -p ./some/long/path/here/
$ cp bad_file some/long/path/here/bad_file_2
$ tree
.
├── bad_file
├── good_file_1
├── good_file_2
└── some
└── long
└── path
└── here
└── bad_file_2
5 directories, 4 files
활성화 globstar
하고 실행하면 두 개의 잘못된 파일이 발견 grep
됩니다 **/*
(grep이 검색할 파일이 아닌 지정된 디렉터리에 대해 불평했기 때문에 표준 오류를 리디렉션하고 있습니다. 이러한 오류는 예상되며 안전하게 무시할 수 있습니다).
$ grep -lPz '^\n$' **/* 2>/dev/null
bad_file
some/long/path/here/bad_file_2
또는 find
파일을 검색하려면 다음을 수행하세요.
$ find . -type f -exec grep -lPz '^\n$' {} +
./some/long/path/here/bad_file_2
./bad_file
답변4
find . -size 1c -exec sh -c '[ -z "$(< $1)" ]' sh '{}' ';' -print
쉘에서 파일을 읽으면 빈 파일이 생성되는 정확히 1바이트 크기의 파일을 찾습니다. sh는 명령 대체에서 후행 개행 문자를 제거합니다.