모든 파일과 하드 링크를 제거하여 디스크 공간을 확보하는 방법은 무엇입니까?

모든 파일과 하드 링크를 제거하여 디스크 공간을 확보하는 방법은 무엇입니까?

나는 이것을 알아 내려고 몇 시간 동안 노력했지만 할 수없는 것 같습니다

내 질문은 파일 이름이 easy이고 그 안에 4개의 서로 다른 하위 디렉터리가 있다는 것입니다. 여기에 이미지 설명을 입력하세요

이제 내가 해야 할 일은 foo 아래의 모든 항목(하드 링크 포함)을 삭제하고 foo의 모든 디스크 공간을 회수하는 것입니다.

입력하여 모든 파일을 제거해 보았습니다.

rm foo/*

하지만 다른 하위 디렉터리에 있는 하드 링크는 제거되지 않습니다.

그런 다음 일치하는 inode가 있는지 확인하려고했습니다.

foo -type f -ls 찾기 | 종류

그리고 이것이 내가 이 명령으로 얻은 것입니다

여기에 이미지 설명을 입력하세요

이 명령은 다른 하위 디렉터리를 표시하지 않고 foo/만 표시합니다.

누군가 나를 도와주세요. 감사합니다.

답변1

GNU 도구를 사용하여 내림차순을 통해 찾은 파일에 하드 링크된 모든 파일을 삭제하려면 다음을 foo수행할 수 있습니다.

dir=foo
mountpoint=$(df --output=target -- "$dir" | tail -n +2)

awk -v RS='\0' -v ORS='\0' '
  ARGIND == 1 {inum[$0]; next}
  {i=$0; getline}
  i in inum
 ' <(find -- "$dir" -xdev ! -type d -links +1 -printf '%i\0') \
   <(find -- "$mountpoint" -xdev ! -type d -printf '%i\0%p\0') |
  xargs -r0 rm -f

rm -rf -- "$dir"

이는 GNU df, GNU awk, GNU 및 프로세스 대체( )를 지원하는 findGNU 쉘( )과 같은 쉘을 가정합니다 .bash<(...)

또한 가 술어(예 : , ...) $dir로 시작하지 않거나 -발생하지 않는다고 가정합니다.find!(

$dir위에서 우리는 속한 전체 파일 시스템에서 파일을 찾습니다 . ( 이 경우) $mountpoint의 상위 디렉터리로 바꾸거나 다른 디렉터리로 바꿀 수 있습니다 .$dir.하위 디렉터리( 123 ABC def여기) 모든 하드링크가 거기에만 있다는 것을 알고 있다면.

위 코드에서는 내림차순을 통해 발견된 링크 수가 1보다 큰 모든 비디렉토리 파일의 inode 번호를 기록합니다 $dir. 그리고 전체 파일 시스템에서 해당 inode 번호를 찾으십시오(적어도 다른 파일 시스템에 의해 마스크되지 않고 탐색할 권한이 있는 섹션). inode 번호는 파일 시스템별로 고유하므로 발견된 -xdev하나의 파일 시스템만 스캔하는지 확인하는 데 사용됩니다.$dir

답변2

rm -rf foo

rm- 파일이나 디렉토리를 제거합니다.

  • -f존재하지 않는 파일과 인수를 무시하고 메시지를 표시하지 않습니다.
  • -r디렉토리와 그 내용을 재귀적으로 제거합니다.

관련 정보