[Linux Command Line] Timestamps 와 찾기(locate find)
Timestamps
mtime
ls -l
파일이 마지막으로 내용이 변경되었을 때,
파일을 마지막으로 수정한 시간입니다
ctime
ls -lc
파일이 마지막으로 변경된 시간입니다.
ctime은 파일이름을 바꾸거나, 이동하거나 사용 권한을 변경할 때도 발생합니다.
(mtime이 바뀌면 ctime 역시 바뀝니다, ctime이 바뀌면 mtime은 바뀌지 않습니다)
atime
ls -lu
atime은 액세스 시간으로, cat과 같은 명령어나 응용프로그램에서 파일을 읽을 때 업데이트됩니다
locate
파일 이름을 찾아내는 명령어로, 머신 전체에서 파일의 경로나 이름을 확인할 수 있습니다.
locate에 문자열 일부를 전달하면, 이 문자열이 일치하는 파일 이름, 또는 경로 이름을 찾아냅니다.
locate는 설치가 필요할 수 있습니다.
아래 명령어를 사용하여 locate를 설치합니다.
(locate가 아닌 mlocate임을 주의해야 합니다)
sudo apt install mlocate
locate는 사전 생성된 DB를 사용합니다.
컴퓨터에 존재하는 모든 파일에 대한 항목을 구성하고, 이를 최신 상태로 유지합니다.
(다만, 실시간 파일 구성에는 시간이 걸립니다)
내장 데이터베이스 파일을 사용하기 때문에, locate 명령어는 매우 빠릅니다.
매번 컴퓨터의 모든 디렉토리, 모든 파일을 검색할 필요가 없이,
기존에 인덱싱된 데이터베이스 파일을 찾으면 굉장히 빠르게 작업을 할 수 있습니다.
경로를 지정해도 되고, 지정하지 않아도 됩니다.
와일드카드를 사용할 수 있습니다.
대소문자를 구분하지만, -i 옵션을 사용하면 이를 무시할 수 있습니다.
-l --limit 옵션을 사용하면 결과의 개수를 제한할 수 있습니다.
-e 옵션을 통해 locate DB엔 존재하지만, 실제로도 존재하는지 확인할 수 있습니다.
(삭제되었을 수 도 있습니다)
updatedb
updatedb 명령어를 통해 mlocate의 (db를)실시간 파일 구성을 업데이트합니다.
권한이 필요합니다.
sudo updatedb
이를 사용하지 않으면 데이터베이스가 구성된 날짜를 기준으로 검색합니다.
find
locate 명령어보다 강력하지만, 실행에는 시간이 좀 더 걸리는 명령어입니다.
locate 명령어는 사전 생성된 DB 파일을 사용하지만, 하나의 파일만을 검색하면 되기 때문에 빠른 속도를 지녔습니다.
find 명령어는 디렉토리 전체나 컴퓨터 전체를 검색합니다.
명령어를 실행하는 위치부터 시작해서 계속적으로 검색합니다.
느리지만, 할 수 있는 것들이 다양합니다.
특히 필터링에 유용합니다.
find -type d 디렉토리만 검색합니다.
find -type f 파일만 검색합니다.
아래 명령어는 예시입니다.
find ~/Desktop -type f -name "*.txt"
-name 대신 -iname을 사용하면, 대소문자 구분 없이 검색합니다.
find -size
find -size +1G
파일 크기에 대한 필터링 검색을 할 수 있습니다.
+는 이상, -는 이하
1G, 50M, 20k 등 크기를 지정할 수 있습니다.
find -user
파일의 소유자를 필터링 조건으로 사용할 수 있습니다.
find -user ride
권한을 다루기 위해, 사용자 소유의 파일을 찾는 경우 유용합니다.
find -empty
비어있는 파일이나 디렉토리를 찾을 수 있습니다.
find -empty -type f
find -empty -type d
Timestamps를 바탕으로 find를 사용할 수 있습니다.
find -mmin
-mtime
find -cmin
-ctime
find -amin
-atime
amin이나 cmin, mmin을 이용해, 분 단위로 파일 검색을 할 수 있습니다.
atime이나 ctime, mtime을 이용해, 단위로 파일 검색을 할 수 있습니다.
find -mmin 30
find -mmin +30
정확히 30분 이전에 변경된 파일을 검색할 수도, 변경된지 30분이 지난 파일을 검색할 수도 있습니다.
최근 1분 사이에 접근 기록이 있는 파일을 검색할 수도 있습니다.
find -amin -1
find -atime +1로 검색을 하면, 최소 2일 전에 접근했던 파일을 검색합니다.
find 논리 연산자와 함께 사용하기
find와 논리 연산자를 사용하는 방법은 나름 직관적입니다.
논리연산자와 find를 함께 사용하여, 여러 조건을 만족하는 것을 찾을 수 있습니다.
-and (암묵적으로 사용되고, 조건이 복잡할 때 사용하기도 합니다)
-or
-not (! 으로 사용할 수도 있습니다)
find -name "*pattern*" -or -name "*file*"
find -type -f -not -name "*.html"
find -exec command '{}' ';'
(-exec가 아닌 -ok를 사용하면, 개별 파일에 대해 command의 실행 여부를 확인합니)
find로 찾은 모든 것들에 대해서 어떤 명령을 수행할 수 있습니다.
find -name "*remove*" -exec rm '{}' ';'
파일 이름에 remove가 들어간 파일을 삭제하도록 할 수 있습니다.
find ~ -type f -empty -exec ls -l '{}' ';'
다양한 조건을 사용하고, 그 결과를 다른 명령어에 사용할 수 있습니다.
find -empty -ok rm '{}' ';'
find로 빈 파일을 찾고, rm으로 삭제할 수 있습니다.
find -type f -name "*.jar" -exec cp '{}' '{}_COPY' ';'
find로 확장자명이 jar인 파일을 찾고, _COPY 문자열을 붙여 사본을 만들 수 있습니다.
xargs
xargs를 실행하면 표준 입력을 받아 빌드하고 이를 실행합니다.
ls처럼 몇몇 명령어는 표준 입력을 지원하지 않기에 -exec 를 활용합니다.
하지만 xargs 명령어를 사용해 표준 입력을 사용할 수 있습니다.
find -empty -exec ls -l '{}' ';'
find -empty | xargs ls -l
xargs를 사용했을 때, -exec와 같은 결과를 얻을 수 있는 것처럼 보입니다.
단, -exec는 각각의 파일마다 명령어를 실행하고 xargs는 한 번의 명령어만 실행합니다.
위의 예시를 보면 -exec는 ls를 10번 실행하고, xargs는 ls를 한 번만 실행합니다.
xargs는 표준 입력을 받아 인자 목록으로 변환합니다.
따라서 표준 입력을 받지 않는 명령어에 사용할 수 있다는 장점이 있습니다.