
나는 이것을 알아 내려고 몇 시간 동안 노력했지만 할 수없는 것 같습니다
내 질문은 파일 이름이 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 및 프로세스 대체( )를 지원하는 find
GNU 쉘( )과 같은 쉘을 가정합니다 .bash
<(...)
또한 가 술어(예 : , ...) $dir
로 시작하지 않거나 -
발생하지 않는다고 가정합니다.find
!
(
$dir
위에서 우리는 속한 전체 파일 시스템에서 파일을 찾습니다 . ( 이 경우) $mountpoint
의 상위 디렉터리로 바꾸거나 다른 디렉터리로 바꿀 수 있습니다 .$dir
.
하위 디렉터리( 123 ABC def
여기) 모든 하드링크가 거기에만 있다는 것을 알고 있다면.
위 코드에서는 내림차순을 통해 발견된 링크 수가 1보다 큰 모든 비디렉토리 파일의 inode 번호를 기록합니다 $dir
. 그리고 전체 파일 시스템에서 해당 inode 번호를 찾으십시오(적어도 다른 파일 시스템에 의해 마스크되지 않고 탐색할 권한이 있는 섹션). inode 번호는 파일 시스템별로 고유하므로 발견된 -xdev
하나의 파일 시스템만 스캔하는지 확인하는 데 사용됩니다.$dir
답변2
rm -rf foo
rm
- 파일이나 디렉토리를 제거합니다.
-f
존재하지 않는 파일과 인수를 무시하고 메시지를 표시하지 않습니다.-r
디렉토리와 그 내용을 재귀적으로 제거합니다.