![모든 파일과 하드 링크를 삭제하여 디스크 공간을 확보하는 방법은 무엇입니까?](https://linux55.com/image/97914/%EB%AA%A8%EB%93%A0%20%ED%8C%8C%EC%9D%BC%EA%B3%BC%20%ED%95%98%EB%93%9C%20%EB%A7%81%ED%81%AC%EB%A5%BC%20%EC%82%AD%EC%A0%9C%ED%95%98%EC%97%AC%20%EB%94%94%EC%8A%A4%ED%81%AC%20%EA%B3%B5%EA%B0%84%EC%9D%84%20%ED%99%95%EB%B3%B4%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
이 문제를 해결하려고 몇 시간 동안 노력했지만 할 수 없는 것 같습니다.
내 문제는 내 파일 이름이 간단하고 그 안에 4개의 서로 다른 하위 디렉터리가 있다는 것입니다.
이제 내가 해야 할 일은 foo 아래의 모든 항목(하드 링크 포함)을 삭제하고 foo의 디스크 공간을 모두 회수하는 것뿐입니다.
입력하여 모든 파일을 삭제해 보았습니다.
RM 부자/*
그러나 다른 하위 디렉터리의 하드 링크는 삭제되지 않습니다.
그런 다음 inode와 일치하는지 확인하려고합니다.
foo 유형 f -ls 종류 찾기 |
이것이 내가 이 명령으로 얻는 것입니다
이 명령은 다른 하위 디렉터리를 표시하지 않고 foo/만 표시합니다.
누구든지 나를 도와줄 수 있나요? 감사해요.
답변1
foo
GNU 도구를 사용하여 내림차순을 통해 찾은 파일에 하드 링크된 모든 파일을 삭제하려면 다음을 수행할 수 있습니다.
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 쉘()과 같은 쉘이 있다고 가정합니다 .awk
find
bash
<(...)
이는 또한 $dir
술어로 시작하지 않거나 술어 -
가 아닌 경우 (예: , ...)를 가정합니다.find
!
(
위에서는 파일이 $dir
속한 전체 파일 시스템을 검색합니다. (이 경우) $mountpoint
상위 디렉터리나 다른 디렉터리를 다음으로 바꿀 수 있습니다.$dir
.
하위 디렉토리( 123 ABC def
여기) 모든 하드 링크가 거기에만 있다는 것을 알고 있다면.
위 코드에서는 링크 수가 1보다 큰 내림차순으로 찾은 모든 비디렉토리 파일의 inode 번호를 기록합니다 $dir
. 그리고 파일 시스템 전체에서 해당 inode 번호를 찾으십시오(적어도 다른 파일 시스템에 의해 가려지지 않고 탐색 권한이 있는 부분). inode 번호는 각 파일 시스템마다 고유하므로 발견된 하나의 파일 시스템만 스캔되도록 -xdev
하기 위해 이를 사용합니다.$dir
답변2
rm -rf foo
rm
- 파일이나 디렉터리를 삭제합니다.
-f
존재하지 않는 파일과 매개변수를 무시하고 메시지를 표시하지 않습니다.-r
디렉터리와 해당 내용을 반복적으로 삭제합니다.