Bash에서 길이가 0인 파일 삭제

Bash에서 길이가 0인 파일 삭제

Linux 터미널 내에서 파일로 이동한 다음 파일이 비어 있으면 삭제하는 bash 스크립트를 만들고 싶습니다.

#!/bin/bash
echo " Enter name of a directory"
read Dir
for Directory in $( ls $HOME )
do 
  test -d $HOME/$dir
  if [ $# -eq 0 ]
  then 
    for filename in $( ls $HOME/$Dir )
    do 
      test -d $HOME/$dir/$filename
      if [ ! -s "$filename"  ]
      then
        rm $HOME/$dir/$filename
      else 
        echo " not empty"
      fi 
    done 
  else 
    echo " $Dir is not a directory" 
  fi 
done

이것은 내가 사용하고 있는 코드이지만 작동하지 않습니다. 생성된 파일을 인식하지만, 비어 있어도 삭제하지 않습니다. Salah는 그러한 파일이나 디렉토리를 표시하지 않습니다

답변1

편집 1(Erik Renouf) 지속성The Open Group Base Spec Issue 6에 지정된 콘텐츠 찾기

편집 2(와일드카드) + 기호 및 원시 {}

이것을 시도하고 교체하십시오.내 디렉토리다음 명령줄에 계산할 디렉터리 이름을 입력합니다.

find "${HOME}"/mydir -size 0 -type f -exec rm {} +

"${HOME}"/mydir 디렉터리와 해당 하위 디렉터리(있는 경우)에 있는 모든 빈 파일을 삭제합니다.

스크립트 버전은 다음과 같습니다.

#!/bin/bash --
find "${HOME}"/"${1}" -size 0 -type f -exec rm {} +

시험

아래에 빈 파일을 모두 나열하세요.시험:

$ find "${HOME}"/testd -size 0 -type f
/home/jay/testd/empty_file.txt

빈 파일을 삭제하려면 스크립트를 사용하세요.

$ chmod +x clearner.sh
$ ./clearner.sh testd

빈 파일을 확인하세요.

$ find "${HOME}"/testd -size 0 -type f
$

답변2

find특수 문자가 포함된 파일 이름을 매우 잘 처리하기 때문에 사용하는 것을 좋아합니다 . find@Jay가 제안한 것과 유사하거나 더 이식 가능한 방식으로 GNU를 사용하여 수행할 수 있습니다.

find "$HOME/$dir" -type f -size 0c -exec rm {} +

$HOME/mydir모든 하위 디렉터리를 찾습니다 . 크기가 0바이트(-size 0c)인 모든 파일( -type f)에는 해당 이름이 인수로 적용되며 , 각 파일을 호출하는 대신( 호출 하는 대신 ) rm많은 인수가 있는 명령줄을 갖게 됩니다.rm+\;-exec

하위 디렉터리로 이동하고 싶지 않고 이식 가능하게 하려면 다음을 수행할 수 있습니다. 현재 쉘의 현재 디렉터리에서 변경되지 않도록 하위 쉘에 넣습니다.

( cd "$HOME/$dir"; find . ! -name . -prune -type f -size 0c -exec rm {} + )

이는 추가 디렉토리가 입력되는 것을 -prune방지 하고 디렉토리를 삭제하여 내림차순 디렉토리 목록의 일부가 되는 것을 방지합니다. 두 결과 모두 현재 디렉터리에 대한 결과만 보고합니다.find.find

이제 현재 디렉터리에 있으므로 메서드에 다시 접근하면서 작성 중이던 스크립트를 다시 방문할 수 있습니다.

스크립트에서 시도하는 작업에 주의해야 합니다. 공백이나 탭과 같은 문자가 포함된 모든 파일은 IFSfor 루프가 파일 이름의 일부를 확인하도록 합니다(예를 들어, 파일을 호출하면 with space여러 반복에서 합계를 얻습니다 with). space디렉토리의 파일을 반복하려면 다음과 같은 것을 사용하는 것이 좋습니다.

for f in $HOME/$dir/*; do
    if [ -f "$f" ] && [ ! -s "$f" ]; then
       printf "It's an empty file: %s" "$f"
    fi
done

.이 glob 솔루션은 dotglob을 활성화하지 않는 한 while으로 시작하는 파일을 선택하지 않습니다.

관련 정보