Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
C
centos
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
CI / CD Analytics
Repository Analytics
Value Stream Analytics
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
platyhouse
centos
Commits
ab20fd47
Commit
ab20fd47
authored
Nov 26, 2025
by
platyhouse
1
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
커밋을 실행하기 위해 사용자의 승인이 필요합니다. 위에서 생성된 커밋 메시지로 진행하시겠습니까?
parent
ef186295
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
518 additions
and
0 deletions
+518
-0
ptyFileMove
ptyFileMove
+455
-0
ptyGitFileHistory
ptyGitFileHistory
+63
-0
No files found.
ptyFileMove
0 → 100755
View file @
ab20fd47
#!/bin/bash
# ptyFileMove
# 다양한 조건으로 파일을 검색하고 지정한 디렉토리로 이동하는 스크립트
# 사용법:
# ./ptyFileMove "*.log" "./backup" # 현재 디렉토리의 .log 파일을 ./backup으로 이동
# ./ptyFileMove "*_eflaw_*" "../data_eflaw" # _eflaw_가 포함된 파일을 ../data_eflaw로 이동
# ./ptyFileMove "*.txt" "/backup" -r -d 10 # 하위 디렉토리까지 .txt 파일 중 10일 이상 지난 파일을 /backup으로 이동
show_usage
()
{
echo
"사용법:
$0
<검색패턴> <목적지디렉토리> [옵션]"
echo
""
echo
"필수 인자:"
echo
" 검색패턴 검색할 파일 패턴 (예: *.log, *_eflaw_*, ./* 등)"
echo
" ./* : 현재 디렉토리의 모든 파일"
echo
" *.log : 현재 디렉토리의 .log 파일"
echo
" /var/log/*.log : /var/log의 .log 파일"
echo
" 목적지디렉토리 파일을 이동할 대상 디렉토리"
echo
""
echo
"검색 조건 옵션:"
echo
" -d 일수 지정한 일수보다 오래된 파일 검색"
echo
" -h 시간 지정한 시간보다 오래된 파일 검색"
echo
" -zerofiles 0바이트 파일 검색"
echo
" -size 크기 특정 크기의 파일 검색 (예: +10M, -1k, 100c)"
echo
" (+: 초과, -: 미만, 단위: c=byte, k=KB, M=MB, G=GB)"
echo
" -user 사용자 특정 사용자 소유 파일 검색"
echo
" -perm 권한 특정 권한의 파일 검색 (예: 777, 644)"
echo
""
echo
"공통 옵션:"
echo
" -r 하위 디렉토리까지 재귀적으로 검색"
echo
" -t 타입 파일 타입 (f: 파일만, d: 디렉토리만, l: 심볼릭링크)"
echo
" -s 파일 크기와 함께 표시"
echo
" -l 상세 정보 표시 (ls -lh 형식)"
echo
" -maxdepth N 검색 깊이 제한 (1: 현재 디렉토리만)"
echo
" -count 개수만 표시"
echo
" --force 확인 없이 즉시 이동"
echo
" --copy 이동 대신 복사"
echo
""
echo
"예제:"
echo
"
$0
'*.log' './backup' # 현재 디렉토리의 .log 파일을 ./backup으로 이동"
echo
"
$0
'*_eflaw_*' '../data_eflaw' # _eflaw_가 포함된 파일을 ../data_eflaw로 이동"
echo
"
$0
'*.log' '/backup' -r -d 10 # 하위까지 .log 파일 중 10일 이상 지난 파일을 /backup으로 이동"
echo
"
$0
'*.txt' './archive' -h 24 # 현재 디렉토리의 .txt 파일 중 24시간 이상 지난 파일을 ./archive로 이동"
echo
"
$0
'./*' './backup' -zerofiles # 현재 디렉토리의 모든 0바이트 파일을 ./backup으로 이동"
echo
"
$0
'*.log' '/backup' -r -d 30 --force # 30일 이상 지난 .log 파일을 확인 없이 /backup으로 이동"
echo
"
$0
'*.tmp' './backup' -size +100M --copy # 100MB 이상의 .tmp 파일을 ./backup으로 복사"
exit
1
}
# 인자 개수 확인
if
[
$#
-lt
2
]
;
then
echo
"오류: 검색 패턴과 목적지 디렉토리를 지정해야 합니다."
echo
""
show_usage
fi
# 첫 번째 인자가 옵션인지 확인
if
[[
"
$1
"
==
-
*
]]
;
then
echo
"오류: 첫 번째 인자는 검색 패턴이어야 합니다."
echo
""
show_usage
fi
# 두 번째 인자가 옵션인지 확인
if
[[
"
$2
"
==
-
*
]]
;
then
echo
"오류: 두 번째 인자는 목적지 디렉토리여야 합니다."
echo
""
show_usage
fi
# 첫 번째, 두 번째 인자 설정
SEARCH_PATTERN
=
"
$1
"
DEST_DIR
=
"
$2
"
shift
2
# 목적지 디렉토리 확인 및 생성
if
[
!
-d
"
$DEST_DIR
"
]
;
then
read
-p
"목적지 디렉토리 '
$DEST_DIR
'가 존재하지 않습니다. 생성하시겠습니까? (y/N): "
-n
1
-r
echo
""
if
[[
$REPLY
=
~ ^[Yy]
$
]]
;
then
mkdir
-p
"
$DEST_DIR
"
if
[
$?
-ne
0
]
;
then
echo
"오류: 목적지 디렉토리 생성에 실패했습니다."
exit
1
fi
echo
"목적지 디렉토리 '
$DEST_DIR
'를 생성했습니다."
else
echo
"작업이 취소되었습니다."
exit
1
fi
fi
# 목적지 디렉토리를 절대 경로로 변환
DEST_DIR
=
$(
cd
"
$DEST_DIR
"
&&
pwd
)
# 패턴에서 경로와 파일명 분리
if
[[
"
$SEARCH_PATTERN
"
==
*
/
*
]]
;
then
# 경로가 포함된 경우
SEARCH_PATH
=
"
${
SEARCH_PATTERN
%/*
}
"
FILE_PATTERN
=
"
${
SEARCH_PATTERN
##*/
}
"
# 경로가 비어있으면 루트로 설정
if
[
-z
"
$SEARCH_PATH
"
]
;
then
SEARCH_PATH
=
"/"
fi
else
# 경로가 없는 경우 현재 디렉토리
SEARCH_PATH
=
"."
FILE_PATTERN
=
"
$SEARCH_PATTERN
"
fi
# 기본값 설정
DAYS
=
""
HOURS
=
""
FILE_TYPE
=
""
SHOW_SIZE
=
false
SHOW_DETAIL
=
false
SHOW_COUNT
=
false
SEARCH_MODE
=
""
FILE_SIZE
=
""
FILE_USER
=
""
FILE_PERM
=
""
MAX_DEPTH
=
"1"
RECURSIVE
=
false
MOVE_FORCE
=
false
COPY_MODE
=
false
# 옵션 파싱
while
[[
$#
-gt
0
]]
;
do
case
$1
in
-d
)
DAYS
=
"
$2
"
SEARCH_MODE
=
"old"
shift
2
;;
-h
)
HOURS
=
"
$2
"
SEARCH_MODE
=
"old"
shift
2
;;
-zerofiles
)
SEARCH_MODE
=
"zero"
shift
;;
-size
)
FILE_SIZE
=
"
$2
"
SEARCH_MODE
=
"size"
shift
2
;;
-user
)
FILE_USER
=
"
$2
"
SEARCH_MODE
=
"user"
shift
2
;;
-perm
)
FILE_PERM
=
"
$2
"
SEARCH_MODE
=
"perm"
shift
2
;;
-r
)
RECURSIVE
=
true
MAX_DEPTH
=
""
shift
;;
-t
)
FILE_TYPE
=
"
$2
"
shift
2
;;
-s
)
SHOW_SIZE
=
true
shift
;;
-l
)
SHOW_DETAIL
=
true
shift
;;
-maxdepth
)
MAX_DEPTH
=
"
$2
"
RECURSIVE
=
false
shift
2
;;
-count
)
SHOW_COUNT
=
true
shift
;;
--force
)
MOVE_FORCE
=
true
shift
;;
--copy
)
COPY_MODE
=
true
shift
;;
-help
|
--help
)
show_usage
;;
*
)
echo
"오류: 알 수 없는 옵션:
$1
"
echo
""
show_usage
;;
esac
done
# 검색 모드가 지정되지 않은 경우 기본 검색 모드로 설정
if
[
-z
"
$SEARCH_MODE
"
]
;
then
SEARCH_MODE
=
"pattern"
fi
# 검색 경로 확인
if
[
!
-d
"
$SEARCH_PATH
"
]
;
then
echo
"오류: 검색 경로 '
$SEARCH_PATH
'가 존재하지 않습니다."
exit
1
fi
# 숫자 유효성 검사
if
[
-n
"
$DAYS
"
]
;
then
if
!
[[
"
$DAYS
"
=
~ ^[0-9]+
$
]]
;
then
echo
"오류: 일수는 숫자여야 합니다."
exit
1
fi
fi
if
[
-n
"
$HOURS
"
]
;
then
if
!
[[
"
$HOURS
"
=
~ ^[0-9]+
$
]]
;
then
echo
"오류: 시간은 숫자여야 합니다."
exit
1
fi
fi
# find 명령어 옵션 구성
FIND_CMD
=
"find
\"
$SEARCH_PATH
\"
"
# 최대 깊이 설정 (-r 옵션이 없고 -maxdepth도 지정되지 않은 경우 기본값 1)
if
[
-n
"
$MAX_DEPTH
"
]
;
then
FIND_CMD
=
"
$FIND_CMD
-maxdepth
$MAX_DEPTH
"
fi
# 파일 패턴 적용
if
[
"
$FILE_PATTERN
"
!=
"*"
]
;
then
FIND_CMD
=
"
$FIND_CMD
-name
\"
$FILE_PATTERN
\"
"
fi
# 파일 타입 옵션 (기본값: 파일만)
if
[
-z
"
$FILE_TYPE
"
]
;
then
FIND_CMD
=
"
$FIND_CMD
-type f"
elif
[
"
$FILE_TYPE
"
=
"f"
]
;
then
FIND_CMD
=
"
$FIND_CMD
-type f"
elif
[
"
$FILE_TYPE
"
=
"d"
]
;
then
FIND_CMD
=
"
$FIND_CMD
-type d"
elif
[
"
$FILE_TYPE
"
=
"l"
]
;
then
FIND_CMD
=
"
$FIND_CMD
-type l"
fi
# 검색 조건 설정
SEARCH_DESC
=
""
case
$SEARCH_MODE
in
pattern
)
SEARCH_DESC
=
"파일명 패턴 매칭"
;;
old
)
if
[
-n
"
$DAYS
"
]
&&
[
-n
"
$HOURS
"
]
;
then
echo
"오류: -d와 -h 옵션은 동시에 사용할 수 없습니다."
exit
1
fi
if
[
-n
"
$DAYS
"
]
;
then
FIND_CMD
=
"
$FIND_CMD
-mtime +
$DAYS
"
SEARCH_DESC
=
"
${
DAYS
}
일 이상 지난 파일"
else
MINUTES
=
$((
HOURS
*
60
))
FIND_CMD
=
"
$FIND_CMD
-mmin +
$MINUTES
"
SEARCH_DESC
=
"
${
HOURS
}
시간 이상 지난 파일"
fi
;;
zero
)
FIND_CMD
=
"
$FIND_CMD
-type f -size 0"
SEARCH_DESC
=
"0바이트 파일"
;;
size
)
FIND_CMD
=
"
$FIND_CMD
-size
$FILE_SIZE
"
SEARCH_DESC
=
"크기:
$FILE_SIZE
"
;;
user
)
FIND_CMD
=
"
$FIND_CMD
-user
$FILE_USER
"
SEARCH_DESC
=
"소유자:
$FILE_USER
"
;;
perm
)
FIND_CMD
=
"
$FIND_CMD
-perm
$FILE_PERM
"
SEARCH_DESC
=
"권한:
$FILE_PERM
"
;;
esac
# 헤더 출력
echo
"============================================"
if
[
"
$COPY_MODE
"
=
true
]
;
then
echo
"파일 복사 작업"
else
echo
"파일 이동 작업"
fi
echo
"============================================"
echo
"검색 패턴:
$SEARCH_PATTERN
"
echo
"검색 경로:
$SEARCH_PATH
"
echo
"목적지:
$DEST_DIR
"
echo
"검색 조건:
$SEARCH_DESC
"
if
[
"
$RECURSIVE
"
=
true
]
;
then
echo
"재귀 검색: 예 (모든 하위 디렉토리)"
elif
[
-n
"
$MAX_DEPTH
"
]
;
then
echo
"검색 깊이:
$MAX_DEPTH
"
fi
if
[
-n
"
$FILE_TYPE
"
]
;
then
case
$FILE_TYPE
in
f
)
echo
"파일 타입: 파일만"
;;
d
)
echo
"파일 타입: 디렉토리만"
;;
l
)
echo
"파일 타입: 심볼릭링크만"
;;
esac
fi
echo
"============================================"
echo
""
# 개수만 표시하는 경우
if
[
"
$SHOW_COUNT
"
=
true
]
;
then
COUNT
=
$(
eval
$FIND_CMD
2>/dev/null |
wc
-l
)
echo
"총
${
COUNT
}
개의 항목을 찾았습니다."
exit
0
fi
# 파일 찾기 및 결과 출력
echo
"대상 파일 목록:"
echo
"============================================"
if
[
"
$SHOW_DETAIL
"
=
true
]
;
then
# 상세 정보 표시
eval
$FIND_CMD
-exec
ls
-lhd
{}
\;
2>/dev/null |
sort
-k9
COUNT
=
$(
eval
$FIND_CMD
2>/dev/null |
wc
-l
)
elif
[
"
$SHOW_SIZE
"
=
true
]
;
then
# 크기와 함께 표시
eval
$FIND_CMD
-exec
ls
-lhd
{}
\;
2>/dev/null |
awk
'{print $5 "\t" $9}'
|
sort
-k2
COUNT
=
$(
eval
$FIND_CMD
2>/dev/null |
wc
-l
)
else
# 기본: 경로만 표시
eval
$FIND_CMD
2>/dev/null |
sort
COUNT
=
$(
eval
$FIND_CMD
2>/dev/null |
wc
-l
)
fi
# 결과 요약
echo
""
echo
"============================================"
echo
"총
${
COUNT
}
개의 항목을 찾았습니다."
echo
"============================================"
# 총 크기 계산 (파일인 경우만)
if
[
"
$FILE_TYPE
"
=
"f"
]
||
[
-z
"
$FILE_TYPE
"
]
||
[
"
$SEARCH_MODE
"
=
"zero"
]
||
[
"
$SEARCH_MODE
"
=
"size"
]
;
then
TOTAL_SIZE
=
$(
eval
$FIND_CMD
-type
f
-exec
du
-cb
{}
+ 2>/dev/null |
tail
-1
|
cut
-f1
)
if
[
-n
"
$TOTAL_SIZE
"
]
&&
[
"
$TOTAL_SIZE
"
!=
"0"
]
;
then
# 바이트를 사람이 읽기 쉬운 형식으로 변환
TOTAL_SIZE_HUMAN
=
$(
numfmt
--to
=
iec-i
--suffix
=
B
$TOTAL_SIZE
2>/dev/null
||
echo
"
${
TOTAL_SIZE
}
bytes"
)
echo
"총 파일 크기:
$TOTAL_SIZE_HUMAN
"
echo
"============================================"
fi
fi
# 이동/복사 처리
if
[
"
$COUNT
"
-eq
0
]
;
then
echo
""
if
[
"
$COPY_MODE
"
=
true
]
;
then
echo
"복사할 항목이 없습니다."
else
echo
"이동할 항목이 없습니다."
fi
exit
0
fi
# 강제 모드가 아닌 경우 확인 받기
PROCEED_MOVE
=
false
if
[
"
$MOVE_FORCE
"
=
true
]
;
then
PROCEED_MOVE
=
true
echo
""
echo
"============================================"
if
[
"
$COPY_MODE
"
=
true
]
;
then
echo
"강제 모드:
${
COUNT
}
개 항목을 복사합니다."
else
echo
"강제 모드:
${
COUNT
}
개 항목을 이동합니다."
fi
echo
"============================================"
else
echo
""
echo
"============================================"
if
[
"
$COPY_MODE
"
=
true
]
;
then
echo
"위의
${
COUNT
}
개 항목을 '
$DEST_DIR
'로 복사하시겠습니까?"
else
echo
"위의
${
COUNT
}
개 항목을 '
$DEST_DIR
'로 이동하시겠습니까?"
fi
echo
"============================================"
read
-p
"진행하시겠습니까? (y/N): "
-n
1
-r
echo
""
if
[[
$REPLY
=
~ ^[Yy]
$
]]
;
then
PROCEED_MOVE
=
true
fi
fi
if
[
"
$PROCEED_MOVE
"
=
true
]
;
then
echo
""
if
[
"
$COPY_MODE
"
=
true
]
;
then
echo
"복사 중..."
else
echo
"이동 중..."
fi
MOVED_COUNT
=
0
FAILED_COUNT
=
0
# 각 파일/디렉토리 이동/복사
while
IFS
=
read
-r
item
;
do
# 파일명 추출
filename
=
$(
basename
"
$item
"
)
if
[
"
$COPY_MODE
"
=
true
]
;
then
# 복사 모드
if
cp
-p
"
$item
"
"
$DEST_DIR
/
$filename
"
2>/dev/null
;
then
echo
"복사됨:
$item
->
$DEST_DIR
/
$filename
"
((
MOVED_COUNT++
))
else
echo
"복사 실패:
$item
(권한 부족 또는 대상에 동일 파일 존재)"
((
FAILED_COUNT++
))
fi
else
# 이동 모드
if
mv
"
$item
"
"
$DEST_DIR
/
$filename
"
2>/dev/null
;
then
echo
"이동됨:
$item
->
$DEST_DIR
/
$filename
"
((
MOVED_COUNT++
))
else
echo
"이동 실패:
$item
(권한 부족 또는 대상에 동일 파일 존재)"
((
FAILED_COUNT++
))
fi
fi
done
< <
(
eval
$FIND_CMD
2>/dev/null
)
echo
""
echo
"============================================"
if
[
"
$COPY_MODE
"
=
true
]
;
then
echo
"복사 완료:
${
MOVED_COUNT
}
개 항목"
else
echo
"이동 완료:
${
MOVED_COUNT
}
개 항목"
fi
if
[
"
$FAILED_COUNT
"
-gt
0
]
;
then
if
[
"
$COPY_MODE
"
=
true
]
;
then
echo
"복사 실패:
${
FAILED_COUNT
}
개 항목"
else
echo
"이동 실패:
${
FAILED_COUNT
}
개 항목"
fi
fi
echo
"============================================"
else
echo
""
echo
"작업이 취소되었습니다."
fi
exit
0
ptyGitFileHistory
0 → 100755
View file @
ab20fd47
#!/bin/bash
# 사용법 체크
if
[
$#
-eq
0
]
;
then
echo
"사용법: ptyGitFileHistory <파일경로>"
echo
"예제: ptyGitFileHistory a.php"
exit
1
fi
FILE_PATH
=
"
$1
"
# 파일이 git에서 추적되는지 확인
if
!
git ls-files
--error-unmatch
"
$FILE_PATH
"
>
/dev/null 2>&1
;
then
echo
"❌ 오류: '
$FILE_PATH
'는 git에서 추적되지 않는 파일입니다."
exit
1
fi
# 파일 이름 추출 (경로 제거)
FILE_NAME
=
$(
basename
"
$FILE_PATH
"
)
# 출력 폴더 생성 (파일명 기반 서브폴더)
BASE_DIR
=
"ptyGitFileHistory_output"
OUTPUT_DIR
=
"
$BASE_DIR
/
$FILE_NAME
"
mkdir
-p
"
$OUTPUT_DIR
"
echo
"📂 '
$FILE_PATH
' 파일의 git 히스토리를 추출합니다..."
echo
""
# git log에서 커밋 해시와 날짜를 가져옴
# 날짜 형식: YYYY-MM-DD-HHMMSS
git log
--follow
--format
=
"%H|%ad"
--date
=
format:
"%Y-%m-%d-%H%M%S"
--
"
$FILE_PATH
"
|
while
IFS
=
'|'
read
-r
COMMIT_HASH COMMIT_DATE
;
do
# 폴더 이름: 날짜-커밋해시
FOLDER_NAME
=
"
${
COMMIT_DATE
}
-
${
COMMIT_HASH
:0:8
}
"
COMMIT_DIR
=
"
$OUTPUT_DIR
/
$FOLDER_NAME
"
# 폴더 생성
mkdir
-p
"
$COMMIT_DIR
"
# 커밋에서 파일 내용 추출
if
git show
"
$COMMIT_HASH
:
$FILE_PATH
"
>
"
$COMMIT_DIR
/
$FILE_NAME
"
2>/dev/null
;
then
echo
"✅
$FOLDER_NAME
"
else
# 파일이 해당 커밋에서 삭제되었거나 없는 경우
echo
"⚠️
$FOLDER_NAME
(파일 없음)"
rm
-rf
"
$COMMIT_DIR
"
fi
done
echo
""
echo
"✅ 완료! 결과는 '
$OUTPUT_DIR
' 폴더에 저장되었습니다."
echo
""
# 생성된 폴더 개수 표시
FOLDER_COUNT
=
$(
find
"
$OUTPUT_DIR
"
-mindepth
1
-maxdepth
1
-type
d |
wc
-l
|
tr
-d
' '
)
echo
"📊 총
$FOLDER_COUNT
개의 버전이 추출되었습니다."
# 폴더 목록 표시
echo
""
echo
"생성된 폴더 목록:"
ls
-1
"
$OUTPUT_DIR
"
|
head
-10
if
[
"
$FOLDER_COUNT
"
-gt
10
]
;
then
echo
"... (나머지
$((
$FOLDER_COUNT
-
10
))
개)"
fi
platyhouse
@platyhouse
mentioned in commit
8587004b
·
Dec 16, 2025
mentioned in commit
8587004b
mentioned in commit 8587004bfbebb2ceff13804bc1eea04727f6a285
Toggle commit list
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment