특정 디렉토리를 찾아 비우는 방법

특정 디렉토리를 찾아 비우는 방법

디렉터리 자체를 그대로 유지하면서 콘텐츠를 찾아 삭제하고 싶습니다.

다음과 같은

find /data1 -name MyTargetDir -type d -exec rm -rv {} \;

그리고

find /data1 -name MyTargetDir -type d | xargs -r rm -vfr

"MyTargetDir"과 "MyTargetDir" 아래의 모든 파일 및 디렉터리를 삭제합니다.

디렉토리를 유지하고 싶지만 비어 있습니다.

답변1

디렉토리를 다시 만드는 것은 매우 깔끔한 접근 방식처럼 보입니다.

find /data1 -name MyTargetDir -type d -exec rm -rv {} \; -exec mkdir {} \;

대신 exec의 하위 쉘을 사용하여 디렉토리에서 rm -rf *(또는 이와 유사한 명령)을 실행할 수 있습니다. 하지만 위의 것보다 이게 더 문제인 것 같습니다. 문제가 발생하면 디렉터리 크기가 정리되는 부작용이 발생합니다.

앞서 언급했듯이 디렉터리를 다시 만드는 것은 너무 큰 문제가 될 수 있습니다. 그렇다면 대안은 다음과 같습니다.

find /data1 -name MyTargetDir -type d -exec bash "-c" "cd {} && rm -r -- * .*" \;

이는 "."을 제거하려는 시도에 대해 불평하는 불행한 문제가 있습니다. 및 ".."이지만 안전해야 합니다.

그렇지 않으면 Perl과 같은 전체 스크립팅 솔루션을 선택할 수 있습니다.

#!/path/to/perl
use strict;
use warnings;
use File::Find;
use File::Path qw/remove_tree/;

my ($dir_to_check, $name_to_remove) = @ARGV;
find(\&wanted, $dir_to_check);
sub wanted {
  if (-d and $_ eq $name_to_remove) {
    remove_tree($_, {keep_root => 1});
  }
}

먼저 디렉터리를 전달한 다음 일치하는 이름을 전달합니다. 더 이상 셸의 한 줄이 아니지만 작동하고 디렉터리를 손상시키지 않으며 허위 경고를 표시하지 않습니다.

답변2

rm -rf MyTargetDir && mkdir MyTargetDir

원하는 대로 작동해야 합니다.

답변3

의심할 바 없이 이 작업을 수행하는 더 좋은 방법이 있지만 다음과 같이 작동해야 합니다.

for MyTargetDir in `find /data1 -name MyTargetDir -type d -depth`
do
   if [ $MyTargetDir != "" ]; then
     rm -rfvi $MyTargetDir/*
   fi
done

if찾고 있는 디렉터리를 찾을 수 없으면 이 명령문을 사용해야 합니다. 이 경우 명령은 rm루트 파일 시스템을 손상시킵니다. 따라서 제가 작성한 내용에 오류가 있는 경우 i명령이 파일 삭제를 시작하기 전에 경고가 표시되도록 해당 옵션도 지정했습니다. i예상대로 작동한다고 만족하면 해당 옵션을 제거할 수 있습니다.

답변4

또는 rm에서 r 옵션 없이 이 명령을 시도해 볼 수도 있습니다. 따라서 디렉토리를 삭제할 수 없습니다.

관련 정보