Computer Science/Etc

Etc] 유닉스에서 휴지통 만들기

TwinParadox 2017. 2. 28. 00:00
728x90

나만의 휴지통 만들기




필자가 학교를 다니면서 학내 전산망에 있는 유닉스(UNIX)를 사용해보고,

온갖 명령어를 입력하고 활용하는 방법을 배우면서 배웠던 것 중에 하나는 C쉘이었다.

쉘 자체를 접한건, 그 이전이긴 해도 할 줄 안다라고 말하기에는 무리가 있었는데,

이 기회에 꽤 많은 걸 했었다.

간단한 확률 게임도 했었고, 디렉토리를 트리처럼 만들어 가시적으로 보이게도 하는 기능도 만들어보고

이런저런 기능들을 하면서 나왔던 과제 중 하나가 바로, 휴지통 기능을 만드는 것이었다.


맞다, 우리가 흔히 윈도우에서의 그 휴지통.

영구 삭제가 아니라 그냥 삭제 혹은 Delete키를 눌러 삭제한 파일이

잠시 보관되어서 복원을 기다리거나 영구히 삭제되는 그 기능을 하는 휴지통을

유닉스에서도 만들어 내는 것이 과제였다.


유닉스 환경에서의 휴지통에

윈도우 환경에서 우리가 사용할 수 있었던 기능들을 다 집어넣는 것이 목표였다.

그래서 먼저 휴지통의 기능을 추려봤다.


1. 원초적인 휴지통의 기능(삭제된 파일 임시 보관)

2. 휴지통의 크기를 임의로 제한하는 기능

3. 휴지통에서 복원시키면 원래 경로로 돌아가게 하는 기능

4. 개별적인 삭제 혹은 복원, 전체적인 삭제 혹은 복원


사실 상기 기능 이외에도, 휴지통을 거치지 않고 바로 삭제하는 기능이 휴지통 설정에 있으나,

개인적으로는 이것이 휴지통의 기능이라고 보긴 그래서 그냥 추가하지 않았다.


이렇게 기능 네 가지 외에도 내가 개인적으로 아쉬웠던 기능들을 추가하고 싶은 것들이 있었다.

개인적으로 아쉬웠던 기능이었을 뿐,

기존의 기능들이 무의미하거나 필요 없는 기능이라는 뜻은 아니다.



1. 설정 용량 초과 시 직접 비울 것을 요구


본래 윈도우에서 작동하는 휴지통은

휴지통이 가득찬 상태에서 휴지통에 뭔가 들어가기 시작하면,

가장 오래 휴지통에 머물러 있던 파일 혹은 디렉토리부터 삭제를 진행한다.

자동으로 휴지통의 용량을 관리하는 것인데,

나는 이런 자동적인 기능이 휴지통 본래의 목적과 어울리는지 의문이 들어

기능을 조금 바꿔 휴지통을 직접 비울 것을 요구했다.


 

2. 휴지통 내 파일 및 디렉토리 통계


일반적인 디렉토리의 경우 우클릭 후 속성을 누르면,

디렉토리 내부 상황(파일과 디렉토리의 수, 용량 등)을 알 수 있는데

휴지통 자체에서는 그런 기능이 없다.

물론, 휴지통의 경로에 직접 접근해 체크하면 가능은 하겠으나,

통상적으로 우리 눈에 보이는 휴지통에서 속성 탭은 그런 기능을 사용할 수 없다.

한눈에 볼 수 있도록 만들어야 겠다는 생각이 들었다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
set TR = $home/.trash
set TRLIST = $home/.trashlist
set TMPLIST = $home/.trashtmplist
set TRVOLUME = $home/.trashvolume
set TROPTION = $home/.trashoption
if (! -e $TR) mkdir $TR
if (! -e $TRLIST) then
        touch $TRLIST
        chmod +x $TRLIST
endif
if (! -e $TRVOLUME) then
        touch $TRVOLUME
        chmod +x $TRVOLUME
        echo "0" >> $TRVOLUME
endif
if (! -e $TMPLIST) then
        touch $TMPLIST
        chmod +x $TMPLIST
endif
if (! -e $TROPTION) then
        touch $TROPTION
        chmod +x $TROPTION
        echo "3000" >> $TROPTION
endif
cs



먼저, 휴지통으로 사용될 디렉토리와 각종 설정과 정보를 담을 파일들에 대한 경로를 설정하고,

파일과 디렉토리가 존재하지 않는 경우 파일과 디렉토리를 설정하도록 하는 부분이다.

trashlist와 trashtmplist는 휴지통 내부 리스트에 대한 정보 저장 용도로,

trashvolume은 휴지통의 크기 정보를 저장하는 용도로,

trashoption은 휴지통의 설정사항들을 저장하는 용도로 사용했다.


이제 와서 보니 휴지통 크기 또한 trashoption에서 다루는 것이 더 나을 것이라는 생각이 든다.



1
2
3
4
5
if ($#argv < 1) then
        echo "사용법 : $0 -[ogdlrx,ar,xc,xz] files..."
        echo "자세한 사용법은 : $0 -g 참고! "
        exit
endif
cs


올바르지 않은 방법으로 휴지통을 사용하는 경우, 알림을 띄워주는 부분이다.




1
2
3
4
5
6
7
8
9
10
11
12
13
switch($argv[1])
        case "-o":
                if ($#argv < 2) then
                        echo "사용법 : $0 -o 용량(byte) "
                        exit
                endif
                set now = `cat $TRVOLUME`
                if ($argv[2< $now) then
                        echo "현재 휴지통에 점유된 용량이 설정하고자 하는 용량보다 큽니다. "
                        exit
                endif
                echo $argv[2> $TROPTION
                breaksw
cs


옵션 설정이라고 해놓긴 했어도, 실상은 용량 설정이 전부다.

적당한 예외 처리도 진행한다.




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
        case "-g":
                echo "  <<< 휴지통 사용 가이드 >>>  "
                echo ""
                echo " -o : 휴지통 최대 용량 변경 "
                echo " $0 -o 용량(Byte) "
                echo ""
                echo " -d : 특정 파일 혹은 디렉토리 삭제 "
                echo " $0 -d file(or directory)... "
                echo ""
                echo " -r : 휴지통 내의 특정 파일 혹은 디렉토리 복원 "
                echo " $0 -r file(or directory)... "
                echo ""
                echo " -ar : 휴지통 내의 모든 파일 및 디렉토리 복원 "
                echo " $0 -ar "
                echo ""
                echo " -l : 휴지통 내용 조회 "
                echo " $0 -l "
                echo ""
                echo " -x : 휴지통 비우기 "
                echo " $0 -x "
                echo ""
                echo " -xc : 휴지통 내의 특정 파일 혹은 디렉토리 삭제하기 "
                echo " $0 -x file(or directory)... "
                echo ""
                echo " -xz : 휴지통 내의 용량이 0인 파일 삭제하기 "
                echo " $0 -xz "
                echo ""
                breaksw
cs


휴지통의 사용방법을 알려주는 가이드다.




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
        case "-d":
                if ($#argv < 2) then
                        echo "사용법 : $0 -d files(or directory)... "
                        exit
                endif
                @ i = 2
                while ($i <= $#argv)
                        if (-e $argv[$i]) then
                                set DirFile = `ls -l $cwd | grep -w $argv[$i] | cut -c1`
                                set Volume = `ls -l $cwd | grep -w $argv[$i]`
                                set PastVolume = `cat $TRVOLUME`
                                if (($PastVolume + $Volume[4]) > $MAX) then
                                        echo "Capacity Exceed! "
                                        echo "용량을 늘리거나, 파일을 삭제해주세요"
                                        break
                                endif
                                @ sum = $PastVolume + $Volume[4]
                                echo $sum > $TRVOLUME
                                mv $argv[$i] $TR
                                echo "$argv[$i] $cwd $DirFile" >> $TRLIST
                                echo "Delete $argv[$i]"
                        else
                                echo "There is No File or Directory Name : $argv[$i]"
                        endif
                        @ i++
                end
                breaksw
cs


휴지통으로 파일이나 디렉토리를 보내는 말 그대로 삭제 작업하는 옵션

리스트에 저장하고, 현재 휴지통 사이즈도 변경

예외 처리도 적당히 넣어줬다.




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
        case "-r":
                if ($#argv < 2) then
                        echo "사용법 : $0 -r files(or directory)... "
                        exit
                endif
                @ i = 2
                while ($i <= $#argv)
                        if (! -e $TR/$argv[$i]) then
                                echo "There is No File like that"
                        else
                                set PastVolume = `cat $TRVOLUME`
                                set Volume = `ls -l $TR | grep -w $argv[$i]`
                                @ sum = $PastVolume - $Volume[4]
                                echo $sum > $TRVOLUME
                                set RPATH = `grep -w $argv[$i] $TRLIST`
                                mv $TR/$argv[$i] $RPATH[2]
                                echo "Restore $argv[$i] in Trash Can To $RPATH[2]"
                                grep -vw $argv[$i] $TRLIST > $TMPLIST
                                mv $TMPLIST $TRLIST
                        endif
                        @ i++
                end
                breaksw
cs


휴지통 안에 있는 파일 혹은 디렉토리 복원하는 옵션

리스트에 별도로 저장해뒀던 경로 등에 대한 정보를 바탕으로 복원을 진행하고,

한 번에 여러 파일, 디렉토리를 복원할 수 있게 했다.




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
        case "-ar":
                echo -"Are you Sure? (Y/N) "
                set answer = $<
                if ($answer == "y" || $answer == "Y"then
                        @ line = `cat $TRLIST | wc -l`
                        if ($line >= 1then
                                while ($line >= 1)
                                        set RPATH = `head -1 $TRLIST`
                                        mv $TR/$RPATH[1] $RPATH[2]
                                        echo "Restore $RPATH[1] in Trash Can To $RPATH[2]"
                                        grep -vw $RPATH[1] $TRLIST > $TMPLIST
                                        mv $TMPLIST $TRLIST
                                        @ line--
                                end
                                echo "0" > $TRVOLUME
                        else
                                echo "The Trash Can is Empty"
                        endif
                else
                        echo "Cancel the Restoring All Files"
                endif
                breaksw
cs


전부 복원

예외 처리도 적당히 넣어줬다.




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
        case "-l":
                echo "===============<Trash Can>==============="
                set dirC = `ls -l $TR | grep ^d | wc -l`
                set fileC = `ls -l $TR | grep ^- | wc -l`
                set PresentVolume = `cat $TRVOLUME`
                echo "디렉토리 개수 : $dirC, 파일 개수 : $fileC"
                echo "용량 현황(byte) : $PresentVolume / $MAX"
                echo "========================================="
                echo -"디렉토리 목록 : "
                set tmp = `cat $TRLIST | grep d$`
                @ i = 1
                while ($i < $#tmp)
                        echo -" $tmp[$i] "
                        @ i = $i + 3
                end
                echo ""
                echo "========================================="
                echo -"파일 목록 : "
                set tmp2 = `cat $TRLIST | grep -v d$`
                @ i = 1
                while ($i < $#tmp2)
                        echo -" $tmp2[$i] "
                        @ i = $i + 3
                end
                echo ""
                echo "========================================="
                breaksw
cs


휴지통 조회 기능

파일과 디렉토리에 대한 정보들을 볼 수 있으며,

이는 쉘 명령어로 가져오도록 했다.




1
2
3
4
5
6
7
8
9
10
11
12
        case "-x":
                echo -"Are you Sure? (Y/N) "
                set answer = $<
                if ($answer == "y" || $answer == "Y"then
                        rm -r $TR
                        cat /dev/null > $TRLIST
                        echo "Clear Trash Can"
                        echo "0" > $TRVOLUME
                else
                        echo "Cancel Clearing"
                endif
                breaksw
cs


휴지통 비우기

완전히 삭제되는 작업이고,

전반적인 초기화 작업이 진행된다.




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
        case "-xc":
                if ($#argv < 2) then
                        echo "사용법 : $0 -xc files(or directory)... "
                        exit
                endif
                @ i = 2
                while ($i <= $#argv)
                        if (! -e $TR/$argv[$i]) then
                                echo "There is No File like that"
                        else
                                set PastVolume = `cat $TRVOLUME`
                                set Volume = `ls -l $TR | grep -w $argv[$i]`
                                @ sum = $PastVolume - $Volume[4]
                                echo $sum > $TRVOLUME
                                grep -vw $argv[$i] $TRLIST > $TMPLIST
                                mv $TMPLIST $TRLIST
                                rm -r $TR/$argv[$i]
                                echo "Remove $argv[$i] in Trash Can"
                        endif
                        @ i++
                end
                breaksw
cs


휴지통 내에서 파일 혹은 디렉토리를 선택해 완전 삭제시킴

작업 완료 후 정보를 갱신해주는 작업도 같이 한다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
        case "-xz":
                echo -"Are you Sure? (Y/N) "
                set answer = $<
                if ($answer == "y" || $answer == "Y"then
                        set weight = `ls $TR`
                        while ($#weight)
                                if (-f $TR/$weight[1]) then
                                        set info = `ls -l $TR/$weight[1]`
                                        if ($info[4== 0then
                                                grep -vw $weight[1] $TRLIST > $TMPLIST
                                                mv $TMPLIST $TRLIST
                                                rm -r $TR/$weight[1]
                                        endif
                                endif
                                shift weight
                        end
                        echo "Success Clearing 0 byte files"
                else
                        echo "Cancel Clearing 0 byte files"
                endif
                breaksw
cs


-x 와 마찬가지로 휴지통 비우기를 진행하지만,

하나씩 삭제를 확인하도록 되어 있음.

삭제를 진행할 때마다 리스트와 용량에 대한 정보 갱신이 이루어진다.




1
2
3
4
5
6
        default:
                echo "잘못 사용한 옵션"
                echo "사용법은 guide 참조"
                echo " $0 -g "
                breaksw
endsw
cs


잘못된 명령인 경우 처리해주는 부분이다.




포스팅이 작성되는 시점에서 거의 7개월 이상 지난 작품이라 그런지

아쉬운 부분도 조금 보이고, 좀 더 색다른 기능에 대한 아이디어도 있지만,

달리 실험할 공간이 없다.(아직 학내 전산망에 내 계정 폴더에 남아는 있을 듯?)


마땅한 코드 하이라이터를 찾지 못해서 Color Scripter에서 언어 설정을 'Bash'로 놓고 했다.

아쉽기 하지만, 아쉬운 대로 하이라이팅을 했는데 나쁘지 않다.

부분 부분 설명을 넣느라 소스를 쪼개놨지만,

전체 소스를 원하는 사람들이 있을 수도(정말 있을까?) 있어. 주소를 공개한다.

그냥 여기에 또 다시 올리기엔 양도 적은 편이 아니고,

그냥 귀찮은 것도 있고 해서 깃허브를 통해 공유를 하겠다.


https://github.com/Twinparadox/CShell/blob/master/TrashCan

728x90