나만의 휴지통 만들기
필자가 학교를 다니면서 학내 전산망에 있는 유닉스(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 -n "Are you Sure? (Y/N) " set answer = $< if ($answer == "y" || $answer == "Y") then @ line = `cat $TRLIST | wc -l` if ($line >= 1) then 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 -n "디렉토리 목록 : " set tmp = `cat $TRLIST | grep d$` @ i = 1 while ($i < $#tmp) echo -n " $tmp[$i] " @ i = $i + 3 end echo "" echo "=========================================" echo -n "파일 목록 : " set tmp2 = `cat $TRLIST | grep -v d$` @ i = 1 while ($i < $#tmp2) echo -n " $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 -n "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 -n "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] == 0) then 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'로 놓고 했다.
아쉽기 하지만, 아쉬운 대로 하이라이팅을 했는데 나쁘지 않다.
부분 부분 설명을 넣느라 소스를 쪼개놨지만,
전체 소스를 원하는 사람들이 있을 수도(정말 있을까?) 있어. 주소를 공개한다.
그냥 여기에 또 다시 올리기엔 양도 적은 편이 아니고,
그냥 귀찮은 것도 있고 해서 깃허브를 통해 공유를 하겠다.
'Computer Science > Etc' 카테고리의 다른 글
Apache, PHP, MySQL을 한방에, APMSETUP (2) | 2017.03.13 |
---|---|
안드로이드 스튜디오, 한글 깨짐 현상(인코딩 변환) (0) | 2017.03.05 |
Etc] MS SQL Server 데이터 형식 (0) | 2017.02.17 |
깃허브의 선물, 학생 개발자팩 (0) | 2017.02.15 |
소스코드 편집기, Notepad++ (0) | 2017.01.20 |