테스트 사이트 - 개발 중인 베타 버전입니다

리눅스 특정 폴더 및 파일 제외 명령어? 채택완료

에를 들어,

현재폴더에서 data 폴더와 config.php 파일을 제외하고 모두 삭제하고자 할 때

어떤 식으로 명령어를 입력해주면 되는지?

댓글을 작성하려면 로그인이 필요합니다.

답변 8개

채택된 답변
+20 포인트

</p>

<p>// php 로 만들어 보았습니다.</p>

<p>class Remove {

    public $scanned_dir = array();

    public $result = array();</p>

<p>    function __construct() {

        $this->scanned_dir = $this->scan_dir('*');

    } </p>

<p>    function scan_dir($pattern, $flags = 0) {

        $files = glob($pattern, $flags);

        foreach (glob(dirname($pattern).'/*', GLOB_ONLYDIR|GLOB_NOSORT) as $dir) 

            $files = array_merge($files, $this->scan_dir($dir.'/'.basename($pattern), $flags)); 

        return $files;

    }</p>

<p>    function remove($remain_dir, $remain_file) { 

        foreach ($this->scanned_dir as $file) { 

            if (basename(__FILE__) == $file) continue;

            $flag = true;

            if (is_dir($file)) {

                foreach ($remain_dir as $v) {

                    if (strpos($file, $v) !== false) {

                        $flag = false;

                        break;

                    } 

                }

                if ($flag) rmdir($file);

            } else {

                foreach ($remain_dir as $v) {

                    if (preg_match("#/$v#", $file)) {

                        $flag = false;

                        break;

                    } 

                }

                foreach ($remain_file as $v) {

                    if ($v == $file) {

                        $flag = false;

                        break;

                    } 

                }

                if ($flag) unlink($file);

            }

            if ($flag) $this->result[] = $file;

        }

        $this->show();

    }</p>

<p>    function show() { 

        echo implode('
', $this->result);

    }

}</p>

<p> </p>

<p>$remain_dir = array('a', 'b', 'data');

$remain_file = array('c.txt', 'config.txt');

$rm = new Remove();

$rm->remove($remain_dir, $remain_file);</p>

<p>

로그인 후 평가할 수 있습니다

답변에 대한 댓글 7개

헐,,,,슈와이 님.... 정말 사람을 왜 이렇게 자주 감동시키세용? ㅎ
감사합니다. ^^
테스트 해보니 아래 사항 빼고 아주 잘 작동하네요.

예를 들어,
오직 data 폴더만 남기려는데, data 복사본 폴더까지 함께 남네요.
(예) data-a , data a, data_a 등등등...

오직 data 폴더만 남기려는 경우와,
data라는 글자가 들어간 경우를 구별하는 기능이 들어가면 더 좋을 것 같습니다. ^^


덕분에 삭제 쉽게 할 수 있게 되어 너무 기분 좋네요.
요새, 감동의 연속입니다. ㅎ
// 수정본입니다.
class Remove {
public $scanned_dir = array();
public $result = array();

function __construct() {
$this->scanned_dir = $this->scan_dir('*');
}

function scan_dir($pattern, $flags = 0) {
$files = glob($pattern, $flags);
foreach (glob(dirname($pattern).'/*', GLOB_ONLYDIR) as $dir)
$files = array_merge($files, $this->scan_dir($dir.'/'.basename($pattern), $flags));
return $files;
}

function remove($remain_dir, $remain_file) {
foreach ($this->scanned_dir as $file) {
if (basename(__FILE__) == $file) continue;
$flag = true;
if (is_dir($file)) {
foreach ($remain_dir as $v) {
if (strpos('/' . $file . '/', '/' . $v . '/') !== false) {
$flag = false;
break;
}
}
if ($flag)
$this->delTree($file);
} else {
if (file_exists($file)) {
foreach ($remain_dir as $v) {
if (preg_match("#/$v#", $file)) {
$flag = false;
break;
}
}
foreach ($remain_file as $v) {
if ($v == $file) {
$flag = false;
break;
}
}
if ($flag) unlink($file);
}
}
if ($flag)
$this->result[] = $file;
}
$this->show();
}

function delTree($dir) {
$files = glob($dir . '*', GLOB_MARK);
foreach ($files as $file) {
is_dir($file) ? $this->delTree($file) : unlink($file);
}
if (is_dir($dir) && file_exists($dir)) rmdir($dir);
}

function show() {
echo implode('<br>', $this->result);
}
}

$remain_dir = array('k', 'data');
$remain_file = array('c.txt', 'config.txt');
$rm = new Remove();
$rm->remove($remain_dir, $remain_file);
방금 테스트 해보니까, 완벽하게 잘 작동하네요.
좋은 소스 공유해주셔서 정말 감사드립니다. ^^*
슈와이 님,
방금 실제로 제 서버에 올려 실행해보니, 약간 덜 삭제되는 게 있네요.

$remain_dir = array('data'); // 보존할 폴더
$remain_file = array(); // 보존할 파일

오직 data 폴더만 남게 설정 후 실행시켰더니, 아래 폴더들이 남아있네요.
FTP로 접속해 지우면 쉽게 삭제되긴 하는데, 기왕이면....다홍치마라.. ^^;;

a/hz/a/aa.php ....테스트차 만들어둔 폴더와 그 안의 파일들
extend 폴더 ... 안의 내용물은 삭제된 상태인데, 폴더는 그대로 남음.
plugin 폴더 ... 대부분 삭제되었는데, 일부 이상한 확장자 파일 하나씩 남은 폴더들이 삭제 안 됨

대충 추론하건데, 폴더 안에 이런 이상한 확장자 파일이 삭제 안 되어 남는 듯 합니다.
.htaccess
.gitignore
.travis.yml
// .htaccess 타입의 파일 삭제 추가
// 제약사항 : .github 타입의 폴더는 처리하지 못함

class Remove {
public $scanned_dir = array();
public $result = array();

function __construct() {
$this->scanned_dir = $this->scan_dir("{,.}*", GLOB_BRACE);
}

function scan_dir($pattern, $flags = 0) {
$files = glob($pattern, $flags);
foreach (glob(dirname($pattern).'/*', GLOB_ONLYDIR) as $dir)
$files = array_merge($files, $this->scan_dir($dir.'/'.basename($pattern), $flags));
return $files;
}

function remove($remain_dir, $remain_file) {
for ($i=count($this->scanned_dir)-1; $i>=0; $i--) {
if (preg_match('/\.(\.)?$/', $this->scanned_dir[$i]) || basename(__FILE__) == $this->scanned_dir[$i]) continue;
if ($this->find_dir($remain_dir, $this->scanned_dir[$i])) continue;

$flag = true;
if (is_file($this->scanned_dir[$i]) && !$this->find_file($remain_file, $this->scanned_dir[$i]))
unlink($this->scanned_dir[$i]);
else if (is_dir($this->scanned_dir[$i]))
rmdir($this->scanned_dir[$i]);
else
$flag = false;

if ($flag) $this->result[] = $this->scanned_dir[$i];
}
$this->show();
}

function find_file($remain_file, $file) {
foreach ($remain_file as $v)
if (basename($file) == $v) return true;

return false;
}

function find_dir($remain_dir, $file) {
foreach ($remain_dir as $v)
if (strpos('/' . $file . '/', '/' . $v . '/') !== false) return true;

return false;
}

function show() {
echo implode('<br>', $this->result);
}
}

$remain_dir = array('data');
$remain_file = array('c.txt');
$rm = new Remove();
$rm->remove($remain_dir, $remain_file);
@슈와이 감사합니다. 한번 테스트 후, 사용후기 다시 남길게용. ^^

댓글을 작성하려면 로그인이 필요합니다.

죄송합니다! 맞는 답변이 달려 다행이네요..!!

로그인 후 평가할 수 있습니다

댓글을 작성하려면 로그인이 필요합니다.

@sinbi

또는

rm !(textfile.txt|backup.tar.gz|script.php|database.sql|info.txt)

이런 방법이 있네요

로그인 후 평가할 수 있습니다

댓글을 작성하려면 로그인이 필요합니다.

@sinbi 죄송합니다 글의 의미를 제대로 파악하지 못했네요.

find [path] -type f -not -name 'textfile.txt' -not -name 'backup.tar.gz' -delete

계속 -not -name 을 추가하시는 방법도 있고..

find . -type f -not -name '*txt' -print0 | xargs -0 rm --

이경우에는 확장자 별로 분류가 가능합니다.

 

로그인 후 평가할 수 있습니다

답변에 대한 댓글 1개

톄스트를 해보니, 약간 불안정 한 것 같네요.

a
a.php
b
b.php
c
c.php

이렇게 있는 상태에서 아래 명령어를 실행했더니,


find . -type f -not -name 'a' -not -name 'a.php' -delete


a
a.php
b

가 남네요. b까지 삭제돼야 정상 같은데....

ps.
관심 갖고 답변 달아주신 것만으로도 감사합니다. ^^

댓글을 작성하려면 로그인이 필요합니다.

find . ! -name 'config.php' -type f -exec rm -f {} +
특정 파일 (Config.php)를 제외하고 삭제합니다 -rf 로 바꾸시면 디렉토리도 삭제 가능할거라보입니다.
로그인 후 평가할 수 있습니다

답변에 대한 댓글 1개

특정 하나는 여기 저기 팁이 많이 있더라구요.
제가 궁금한 건....여러 개를 설정하는 거..^^;

댓글을 작성하려면 로그인이 필요합니다.

위험하게 리눅스에서하지마시고 대부분폴더를지우실꺼면..그냥 FTP로 DATA폴더 받아서 

윈도우에서 그냥 필요없는애들 다지우고 쓸애들만 업로드후 권한설정하는게 편하실수도있어요~

서버는잘모를때 잘못만지면 다날라가니 ㅎㅎ 

로그인 후 평가할 수 있습니다

답변에 대한 댓글 3개

ㅎㅎㅎ 그러잖아도 얼마 전 날려먹었더용
ㅎㅎ 계속쓰고 확실하게 알때 서버는 만지는게 좋구요 ..
애매하다싶으면 윈도우에 도움을 받으세요 ㅎㅎ
운영서버라면 더더욱 조심조심...
맞습니다. 모르면 안 건들어야 하는데,,
설마 이거 건들어 문제되겠어 하는 방심이....화를 키우네용.ㅎ

댓글을 작성하려면 로그인이 필요합니다.

답변에 대한 댓글 1개

적어진대로 해봤는데, 안 되는 것 같아요.

aa라는 폴더를 만들고 그 안에 들어가서 아래 폴더와 파일들을 만들었습니다.
a
a.php
b
b.php
c
c.php

find . ! -path "./a*" ! -path "./b*" | cut -d "." -f2 | cut -d "/" -f2 | xargs rm -rf {} \;
위 명령어를 aa 폴더 안에서 넣었는데, 전혀 변화가 없네용.

댓글을 작성하려면 로그인이 필요합니다.

http://blog.naver.com/PostView.nhn?blogId=beahey&logNo=90097133614

참고하시면 될것 같습니다.

혹시 모르니 백업후 실행하시는게 좋을거 같습니다.

로그인 후 평가할 수 있습니다

답변에 대한 댓글 1개

위 페이지도 이미 찾아서 봤는데,
폴더와 파일 등 여러 개를 한꺼번에 설정하는 게 없다보니..ㅎ

댓글을 작성하려면 로그인이 필요합니다.

답변을 작성하려면 로그인이 필요합니다.

로그인

전체 질문 목록