전체 내용이 "\n"인 모든 파일을 재귀적으로 나열하는 방법

전체 내용이 "\n"인 모든 파일을 재귀적으로 나열하는 방법

\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-zgrep\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

globstarbash 옵션(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는 명령 대체에서 후행 개행 문자를 제거합니다.

관련 정보