명령 행을 통해 크기가 0 바이트 인 파일을 제거 하시겠습니까?


16

그래서 다른 디렉토리로 채워진 디렉토리를 얻었고 크기가없는 파일을 제거 할 수 있는지 궁금했습니다. 일반적으로 이러한 파일은 0 바이트이며 모든 하위 디렉토리를 병합하고 싶기 때문에 완벽하게 합법적 인 파일을 무중력 0 바이트 파일로 바꿀 수 있으며 합법적 인 파일이 있습니다. 0 바이트 파일을 제거하는 방법은 무엇입니까?

답변:


34

찾기 명령을 사용하여 크기별로 파일을 찾고 파일 이름을 표준 출력으로 인쇄하십시오.

find . -type f -size 0b -print

대체 -print-delete파일을 삭제하는 대신 화면에 인쇄 할 수 있습니다.

find . -type f -size 0b -delete

이제 파일을 한 위치에서 다른 위치로 옮길 수있는 방법이 있습니까? 크기가 같으면 충돌이 바뀌고 크기가 다르면 두 복사본을 모두 유지합니까?
user245115

이것은 rsync 작업처럼 들립니다 .

7
-empty대신 사용할 수 있습니다 -size 0b.
Kevin

6

재귀 적으로 크기가 0 인 모든 파일을 찾아서 제거하십시오.

find . -type f -size 0 -print0 | xargs -I{} -0 rm {}

예:

% ls -og   
total 4
-rw-rw-r-- 1 0 Jun  7 20:31 bar
-rw-rw-r-- 1 5 Jun  7 20:29 foo

% find . -size 0 -print0 | xargs -I{} -0 rm {}

% ls -og                                      
total 4
-rw-rw-r-- 1 5 Jun  7 20:29 foo

4

쉘에서 직접 할 수도 있습니다. 이것은 비어있는 숨겨진 파일 (이름이로 시작하는 파일)을 삭제하지 않으려는 경우에 유용 할 수 있습니다 .. 당신도 그것을 할 수 있지만 find대안은 쉘 자체를 사용하는 것입니다.

shopt -s globstar
for file in **/*; do [ ! -s "$file" ] && [ -f "$file" ] && rm "$file"; done

설명

  • shopt -s globstar: bash에 대해 globstar 옵션을 켜서 **하나 이상의 하위 디렉토리와 일치시킵니다. **/*현재 디렉토리와 모든 하위 디렉토리의 모든 파일 및 디렉토리와 일치합니다.
  • for file in **/*; do ...; done : 발견 된 모든 파일 및 디렉토리를 반복합니다.
  • [ ! -s "$file" ]: [ -s "$file" ]파일이 존재하고 비어 있지 않으면 true입니다. 따라서 파일이 존재하지 않거나 비어 있으면 (테스트 [ ! -s "$file" ]!반대) 참입니다.
  • [ -f "$file" ]: 파일이 일반 파일 인 경우 true입니다. 디렉토리 나 장치 파일 또는 심볼릭 링크 등이 아닙니다.
  • rm "$file" : 파일을 삭제합니다.

&&이것은 단지 빈, 일반 파일을 삭제 있도록 이전이 성공하면 다음 명령은 실행되어 있는지 확인합니다.


그리고 나는 내 대답이 복잡하다고 생각했다 :) +1
AB

2

위의 대부분의 대답은 맞지만이 명령을 살펴보십시오.

0 바이트 크기의 파일은 빈 파일을 의미합니다

이 명령을 실행할 수 있지만

find . -type f -empty -delete

빈 파일이 모두 삭제됩니다.

삭제하기 전에 해당 파일을 살펴볼 수 있습니다.

find . -type f -empty

포함하지 않는 우분투 14.04 LTS,에 -type f, -empty또한 비어있는 디렉토리를 삭제합니다. 방금 맨 페이지를 확인했습니다.
Bulrush
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.