-
[42경산] 3기 1차 라피신 회고 - shell 명령어 (2)Linux Shell 2025. 3. 3. 16:59
이번 포스팅에서는,
find
cat -e
file
passwd
shadow
group
id
명령어를 다룬다.
1. find 명령어
find [옵션] [경로] [표현식]
복잡한 리눅스 파일 시스템 구조에서 원하는 파일을 가능한 정확히 찾을 수 있도록, find 명령에는 다양한 옵션이 존재합니다. 일반적인 리눅스 명령어와는 조금 다르게, find 명령은 옵션보다 표현식이 더 많이 사용됩니다. 그래서 현재 디렉토리에 있는 파일을 찾기 위해 find 명령을 사용하는 경우는 드물고 (ls 사용), 지정된 디렉토리에 포함된 디렉토리 및 패턴으로 지정된 파일 이름으로 파일을 찾는 경우가 많죠.
find . -name "FILE" # 특정 파일 find . -name "STR*" # 특정 문자열로 시작하는 파일 find . -name "*STR" # 특정 문자열로 끝나는 파일 find . -name "*STR*" # 특정 문자열이 포함된 파일 find . -empty # 빈 폴더 또는 크기가 0인 파일 find . -name "*.EXT" -delete # 특정 확장자 파일 검색 후 삭제 find . -name [FILE] -print0 # 검색 결과 줄바꿈 없이 출력 find . -name [FILE] -type f # 파일 또는 폴더만 검색 find . -name [FILE] -exec ls -l {} \; # 검색된 파일의 상세 정보 출력 find . -name [FILE] -exec wc -l {} \; # 검색된 파일의 라인 수 출력
표현식에 연산자를 사용하는 방법
(exp): 표현식 우선순위 지정
!exp: 표현식 결과에 NOT 연산
exp1 -a exp2: 표현식 간 AND 연산
exp1 -and exp2
exp1 exp2
exp1 -o exp2: 표현식 간 OR 연산
exp1 -or exp2find . ! -name "exo2.tar" -delete # exo2.tar 제외하고 삭제
(예시 1) 현재 경로에서 모든 파일 찾기
# 현재 디렉토리에서 모든 파일 찾기 find . -type f \( -name "~" -o -name "#*" -o -name "*#" \) -print -delete
- find . -type f : file 타입만 출력
- -print : 검색 결과를 출력. 검색 항목은 newline으로 구분. (기본 값)
- -delete : 검색된 파일 혹은 디렉토리 삭제
- ()는 함수로 인식되기 때문에 를 붙여야 함수 인식을 무시
- -o 는 or
- -name "file" : "file"이라는 파일 이름
(예시 2) 리눅스에서 rm 명령어를 사용할 때 특정 파일만 제외하고 폴더 내 모든 파일을 제거
# 특정 파일만 제외 find . -type f ! -name 'file_to_keep.txt' -exec rm -f {} + # .: 현재 디렉토리에서 검색 # -type f: 파일만 찾기 # ! -name 'file_to_keep.txt': 'file_to_keep.txt' 파일을 제외한 나머지 파일 # -exec rm -f {} +: 찾은 파일을 rm 명령어로 삭제 # 디렉토리까지 제외 find . ! -name 'file_to_keep.txt' ! -name 'dir_to_keep' -exec rm -rf {} +
2. cat -e 옵션
cat 명령어에서 -e 옵션은 출력 결과에서 줄 끝에 특별한 문자를 표시하기 위해 사용됩니다. 이 옵션은 -E와 -T 옵션을 결합한 기능을 제공합니다.
(1) 줄 끝에 $ 표시: 각 줄의 끝에 $ 문자를 표시하여 줄이 끝났음을 나타냅니다. 이 기능은 공백 문자나 개행 문자가 어떻게 처리되고 있는지 시각적으로 확인할 때 유용합니다.
(2) 제어 문자 표시: -T 옵션처럼, 제어 문자를 ^와 같은 형식으로 표시합니다.
따라서, cat -e는 두 가지 중요한 효과를 결합합니다:
- 줄 끝에 $를 표시
- 제어 문자는 ^ 형식으로 표시 (예: ^M, ^D 등)
제어 문자(Control Characters)는 텍스트 파일에서 보이지 않는 특수 문자들로, 텍스트의 서식이나 제어를 위한 기능을 수행하는 문자들입니다. 이 문자들은 화면에 표시되지 않지만, 텍스트의 처리나 출력에 영향을 미칩니다.
일반적인 제어 문자들:- \n (줄 바꿈, LF): 줄을 바꾸는 제어 문자. 화면에서 줄 바꿈을 나타냅니다.
- \r (캐리지 리턴, CR): 커서를 줄 맨 앞으로 이동시키는 제어 문자.
- \t (탭, TAB): 수평 탭을 삽입하는 제어 문자.
- ^C: 프로세스를 중단시키는 신호.
- ^D: 파일의 끝(EOF)을 나타내는 제어 문자.
- ^M: 캐리지 리턴(CR)을 나타내는 제어 문자로, 주로 윈도우에서 사용하는 줄 바꿈 방식에서 사용됩니다.
제어 문자의 예시:
- ^A: \x01 (ASCII 1)
- ^C: \x03 (ASCII 3, 중단 신호)
- ^D: \x04 (ASCII 4, EOF)
- ^M: \x0D (ASCII 13, 캐리지 리턴)
3. file 명령어
file [-bcdEhiklLNnprsSvzZ0] [--apple] [--exclude-quiet] [--extension]
[--mime-encoding] [--mime-type] [-e testname] [-F separator]
[-f namefile] [-m magicfiles] [-P name=value] file ...
file -C [-m magicfiles]
file [--help]file 명령어는 파일의 형식을 판별하는 명령어로, 주어진 파일이 실제로 어떤 종류의 데이터나 포맷을 갖고 있는지를 알려줍니다. 이 명령어는 파일 확장자에 관계없이 파일의 내용을 검사하여 MIME 타입, 포맷, 인코딩 등을 식별할 수 있습니다.
파일의 형식을 판별하는 방법은 매직 파일 (magic file)을 사용합니다. 매직 파일은 각 파일 형식의 특징적인 바이트 시퀀스를 저장한 데이터베이스입니다. file 명령어는 이 매직 파일을 참조하여 파일 형식을 판단합니다.# 기본 사용법 file example.txt # example.txt: ASCII text file ex1 ex2 ex3 # ex1: ASCII text # ex2: PNG image data, 150x150, 8-bit/color RGB, non-interlaced # ex3: PDF document, version 1.4 # MIME 타입 확인 (-i 옵션) # 인터넷에서 파일의 형식을 식별하는 표준 방식 file -i example.txt # example.txt: text/plain; charset=us-ascii # 인간이 읽을 수 있는 정보 출력 (-b 옵션) file -b example.txt # ASCII text # 파일의 내용을 바이트 단위로 출력 (-e 옵션) # 특정 바이트 위치를 출력 file -e test.png
file 명령이 파일 종류를 판별 하는 순서
참고자료
(1) 디바이스, 디렉토리, 심볼릭 링크 등의 스페셜 파일 체크
- 일반적으로 /usr/share/file/magic 또는 /etc/magic 경로에 매지파일이 존재함
(2) 압축 파일 체크
(3) tar 파일 체크
(4) magic 데이터베이스 파일에 따른 체크
(5) ASCII, Unicode 등의 텍스트 파일 종류 체크
(6) 위의 어떤 경우에도 해당하지 않으면 단순 바이너리 파일로 판단.magic 파일의 엔트리는 4개의 필드로 구성
- 처음 혹은 이전 레벨로부터의 오프셋 값
- 데이터 종류
- 값
- 출력 문자열
magic 오프셋 표기법
- 여기서 레벨은 오프셋 값의 앞에 적힌 '>'을 의미(ex. '>4'이라고 적혀 있으면, 다시 처음부터 4바이트 떨어진 위치를 읽고 비교)
- 같은 수의 '>'가 나열되어 잇는 경우: 같은 방식으로 이전 레벨로부터의 오프셋 값에 해당 하는 내용을 보고 진행
- '일치한 엔트리 앞에 '>'가 하나 더 많은('>>') 엔트리가 있으면 계속해서 그 엔트리에 대한 일치처리elf 파일에 대한 file 명령이 자신을 판별하는 순서
1. 0 string \177ELF ELF
파일의 처음부터 0바이트 떨어진 위치의 문자열이 "\177ELF"와 일치하는지 확인.
→ 일치하므로 "ELF"라고 표시
2. >4 byte 0 invalid class
처음부터 4바이트 떨어진 위치의 1바이트가 1임을 확인
→ 일치하지 않으므로 다음 행으로 이동.
3. >4 byte 1 32-bit
처음부터 4바이트 떨어진 위치의 1바이트가 1임을 확인.
→ 일치하므로 "32-bit"라고 표시
4. 이후 당분간 일치하지 않으므로 계속 진행.
5. >5 byte 1 LSB
처음에서부터 5바이트 떨어진 위치의 1바이트가 1임을 확인.
→ 일치하므로 "LSB"라고 표시.
6. 이 과정을 끝까지 반복.매직파일
매직 파일은 다양한 파일 형식의 "매직 넘버" 또는 "시그니처"를 정의한 텍스트 파일입니다. 매직 넘버는 파일의 특정 위치에서 나타나는 특정한 바이트 시퀀스를 의미합니다. 예를 들어, JPEG 파일은 항상 파일의 시작 부분에 특정 바이트 (0xFF 0xD8 0xFF 0xE0 등)가 존재합니다. 매직 파일은 /usr/share/file/magic 또는 /etc/magic와 같은 경로에 위치하며, file 명령어가 이를 참고하여 파일 형식을 분석합니다. 매직 파일의 규칙은 파일 형식에 따라 다양하며, file 명령어는 이를 사용하여 확장자와 관계없이 실제 파일의 형식을 인식합니다.
file -m /path/to/your/custom/magic/file /path/to/file/to/examine
매직파일 작성 방법
# ft_magic_range (0~42 바이트 위치 범위에서 찾기) 0 search/42 42 File containing "42" !:mime text/x-42 # ft_magic (정확히 42 바이트 위치에서 찾기) 41 string 42 File containing "42" !:mime text/x-42 # ft_magic (정확히 42 바이트 위치에서 찾고 42 File 출력) 41 string 42 42 File # testfile.txt # 00000000 00000000 00000000 00000000 00000042 file -m magicfile.mgc test.txt # testfile.txt: File containing "42", ASCII text
한글은 2바이트, 영문/숫자/특수문자 1바이트
!:는 조건이 충족되었을 때 설정할 MIME 타입을 지정하는 규칙입니다.
x-42: 42개 파일 유형의 파일을 감지하도록 적절하게 포맷ELF 파일
ELF (Executable and Linkable Format) 유닉스 계열 운영체제의 실행, 오브젝트 파일, 공유 라이브러리, 또는 코어 덤프를 할 수 있게 하는 바이너리 파일이다. 간단히, 실행 파일이다. 원래 뜻은 Extensible Linking Format 이라는 뜻을 가지고 있었다.
ELF 파일의 예시- Executable Files
- 운영체제의 표준 실행 바이너리
- ls, cd, mv, cp 등등
- Shared object files
- libc-2.23.so
- Relocatable files
- 컴파일 된 오브젝트 파일
- hello_world.o
- Core dump files
사용하는 운영체제는 유닉스, BSD, 솔라리스, 그리고 리눅스가 있다. 아무리 같은 바이너리 포멧이라하여도, 서로 호환이 되지 않는다. 예를 들어, 리눅스 프로그램을 솔라리스에서 돌리려고 하면 에러가 나온다.
4. passwd, shadow, group 폴더
/etc/passwd
(Data 형태) 사용자 이름:암호:사용자ID:그룹ID:전체이름:홈디렉토리:기본셸
/etc/shadow비밀번호를 조회할 때 사용한다.
/etc/group그룹확인 정보를 확인할 수 있다.
(Data 형태) 그룹:비밀번호:그룹ID:그룹에 속한 사용자 이름
빈 값으로 나타나는 경우 사용자가 속해 있으나 표현이 되지 않은 것5. id 명령어
id [OPTOIN] [USER]
실제 및 유효 사용자 및 그룹 ID를 출력
지정된 각 USER에 대한 사용자 및 그룹 정보를 인쇄하거나 (USER가 생략된 경우) 현재 사용자에 대한 정보를 출력한다.
- -a 다른 버전과의 호환성을 위해 무시합니다.
- -Z, --context 프로세스의 보안 컨텍스트만 인쇄합니다.
- -g, --group 유효 그룹 ID만 인쇄합니다.
- -G, --groups 모든 그룹 ID를 인쇄합니다.
- -n, --name -ugG의 경우 숫자 대신 이름을 인쇄합니다.
- -r, --real -ugG의 경우 유효 ID 대신 실제 ID를 인쇄합니다.
- -u, --user 유효 사용자 ID만 인쇄합니다.
- -z, --zero 공백이 아닌 NUL 문자로 항목을 구분합니다. 기본 형식에서는 허용되지 않습니다.
- --help 이 도움말을 표시하고 종료합니다.
- --version 버전 정보를 출력하고 종료합니다.
'Linux Shell' 카테고리의 다른 글
[42경산] 3기 1차 라피신 회고 - shell 명령어 (3) (0) 2025.03.10 [42경산] 3기 1차 라피신 회고 - shell 명령어 (2) (0) 2025.03.05 [42경산] 3기 1차 라피신 회고 - norminette 문서 핵심 내용 요약 (0) 2025.03.03 [42경산] 3기 1차 라피신 회고 - shell 명령어 (1) (0) 2025.02.17