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

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

이 문제를 해결하려고 몇 시간 동안 노력했지만 할 수 없는 것 같습니다.

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

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

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

RM 부자/*

그러나 다른 하위 디렉터리의 하드 링크는 삭제되지 않습니다.

그런 다음 inode와 일치하는지 확인하려고합니다.

foo 유형 f -ls 종류 찾기 |

이것이 내가 이 명령으로 얻는 것입니다

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

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

누구든지 나를 도와줄 수 있나요? 감사해요.

답변1

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

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 , GNU 및 GNU 쉘()과 같은 쉘이 있다고 가정합니다 .awkfindbash<(...)

이는 또한 $dir술어로 시작하지 않거나 술어 -가 아닌 경우 (예: , ...)를 가정합니다.find!(

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

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

답변2

rm -rf foo

rm- 파일이나 디렉터리를 삭제합니다.

  • -f존재하지 않는 파일과 매개변수를 무시하고 메시지를 표시하지 않습니다.
  • -r디렉터리와 해당 내용을 반복적으로 삭제합니다.

관련 정보