디렉터리에서 가장 큰 파일 중 일부를 삭제합니다.

디렉터리에서 가장 큰 파일 중 일부를 삭제합니다.

디렉토리에서 특정 개수의 가장 큰 파일을 삭제하고 싶습니다.

다음을 사용하여 상위 10개의 파일 이름을 얻을 수 있습니다.

ls -S | head(또는 더 풍부하지만 더 복잡한 구문 분석 ls -lS | head)

rm에 어떻게 전달합니까? xargs를 통해?

그러면 ls -S | head | xargs rm작동합니다(파일 이름에 공백 등이 있더라도?).

더 나은/안전한 방법이 있나요?

죄송합니다. 실수할까봐 직접 테스트할 수는 없습니다(디렉토리에는 삭제하고 싶지 않은 항목이 있습니다).

저는 macOS를 사용하고 있습니다.

답변1

그러면 ls -S | head | xargs rm작동합니다(파일 이름에 공백 등이 있더라도?).

아니요. xargs기본적으로 개행 문자뿐만 아니라 모든 공백으로 분할됩니다. 그리고 모든 인수가 공백으로 구분되어 인쇄되기 | xargs echo때문에 이를 볼 수 없습니다 . echo(이와 같은 방법은 | xargs printf "%s\n"줄 바꿈으로 구분하여 인쇄하므로 파일 이름 중간에 분할이 발생하는지 확인할 수 있습니다.)

최소한 GNU xargs는 -d '\n'개행 문자로만 분할되어야 하며, 많은 버전의 xargs는 -0NUL 문자( 와 함께 작동 find -print0)로 분할되어야 합니다. 최소한 첫 번째 항목이 필요하지만 일반적으로 파일 이름에 개행 문자가 포함될 수도 있습니다. 이 경우 head큰 이점도 없습니다.

나는 당신에게 경고할 의무가 있습니다구문 분석된 출력은 ls잘못된 것으로 간주됩니다., 개행 문자가 없더라도 적어도 일부 버전에서는 출력이 중단되는 것 같습니다. (그러나 개행 문자나 인쇄할 수 없는 문자가 없다면 아마도 안전할 것입니다. 아마도.)

답변2

나는 다른 접근법을 사용할 것입니다. 이 같은:

size=20000 # set a limit (in bytes), above these we will delete

for file in *
do
  [[ -f "$file" ]] || continue

  fileSize=$(stat --format "%s" "$file")

  if (( $fileSize > $size )) # if file is bigger than 20000 bytes
  then
    rm "$file" # delete the file
  fi          
done

이렇게 하면 공백이 있는 파일을 제거할 수 있고 $size변수를 사용하여 실제로 "큰" 파일을 결정할 수 있습니다. 삭제할 때마다 메시지를 표시하려면 -i다음 스위치를 사용하십시오.rm -i

편집하다:
방금 OS X에서 이 프로그램을 실행하고 있다는 것을 깨달았습니다. 현재 OS X가 설치된 컴퓨터에 액세스할 수 없습니다. statOS X에서 크기를 가져오는 데 다른 형식이 있을 위험이 있을 수 있습니다. 즉, 이 --format "%s"옵션은 작동하지 않을 수 있습니다. OS X를 확인해 보세요 man stat!

답변3

나도 함께 갈 것이다.

find . -type f -size +10M -delete -print

정말로 ls 경로로 가고 싶다면 아마도;

ls -S | head -1 | while read af; do rm "$af"; done

답변4

사용다루기 힘든. 파일을 크기별로(더 일반적으로는 날짜별로) 정렬하고 선택하는 방법이 있습니다. Zsh는 OSX/macOS의 표준 설치의 일부이지만 다른 Unix 변형에서는 별도로 설치해야 할 수도 있습니다.

이름 이외의 기준을 사용하여 파일을 선택(및 정렬)하는 방법은 다음과 같습니다.글로벌 예선. 예를 들어 디렉터리에서 가장 큰 파일 10개를 나열하려면 OL크기 내림차순 정렬(ength) [1,10]상위 10개를 나열합니다.

ls -ldU *(OL[1,10])

zsh 없이 이 작업을 수행하는 것은 더 복잡합니다. 특히 특수 문자가 포함된 파일 이름을 처리해야 하는 경우 더욱 그렇습니다. 파일 이름에 인쇄할 수 없는 문자나 개행 문자가 포함되어 있지 않은 한 구문 분석할 수 있습니다 ls.

ls -S | head -n 10 | while read -r filename; do echo rm -- "$filename"; done

관련 정보