반응형

개발을 하다 보면 큰 파일들을 다루게 될 때가 종종 있다.
임베디드 개발을 예로 들자면 타겟의 루트 파일 시스템을 직접 flashing 해야 하거나
어느 때는 아주 큰 용량의 core 파일이나 로그 파일을 확인해야 할 때도 있다.

평소에 파일 관리를 잘하고 꼼꼼한 사람들은 안 그러겠지만,
나 처럼 즉흥적으로 처리하는 걸 좋아하거나 여기저기 다른 부서, 고객들로부터 다양한 이슈를 전달 받거나 하다 보면 
어느 순간 부족한 용량으로 인해 당황하게 될 때가 있다.

그럴 때 어디에 뭐가 있는지 찾는 일은 아주 성가시고 번거로운 일인데,
그래서 급하게 하나 만들었다.

큰 파일을 찾는 bash script.
find 기반으로 동작하며 꽤 쓸만하여 공유한다.
사실 한줄 짜리고 find 명령어에 능숙한 사람이라면 크게 의미 없지만 파라미터를 받아서 편하게 쓸 수 있는 장점이 있다...;

언제나 그렇듯 서두가 길었고, 스크립트는 다음과 같다.

#!/bin/bash

MIN_SIZE=${1:-800M}

ROOT_PATH=${2:-/}

find "$ROOT_PATH" -type f -size +"$MIN_SIZE" -exec du -h {} + | sort -rh | head -n 30

 

사용법은 다음과 같다.

 

# 사용법
./${script_path} ${minimum_size} ${search_path}

# 예시
./find_large.sh 1000M /data

 


즉 파라미터로 특정 크기 이상의 파일을 찾기 위해, 파일 탐색을 위한 파일의 최소 사이즈를 넘겨준다.

이를 통해 해당 사이즈보다 큰 파일들만을 검색하게 된다.
그리고 다음 파라미터로 검색을 수행 할 경로를 써주면 된다.

 

급할 때 나름 유용하니 머리 한 편에 이런 글이 있었지 하고 나중에 써먹어보길 바란다.

반응형

'Spadeworks > bash' 카테고리의 다른 글

[bash] 명령어 반복  (0) 2023.09.19
[bash] 파일 탐색  (0) 2023.09.10
[bash] bash를 이용한 json 파일 파싱  (0) 2022.08.11
[bash] 특정 길이의 무작위 문자열 획득  (0) 2022.08.11
[bash] 프로세스 존재 여부 확인  (0) 2022.08.11
반응형

개발을 하다보면 하루 종일 터미널에서 빠져나오지 못하고 열심히 아주 열심히 삽질을 하고 있는 자신을 마주할 때가 있다.
그러한 삽질을 대신 해줄 수 있는 스크립트를 하나 가져왔다.

파라미터로 실행하고자 하는 명령어와 반복 횟수, 실행 주기를 설정하면 그에 맞게 명령어를 반복해주는 스크립트이다.
뭐 cron을 쓸 수도 있을 것이고 watch를 쓸 수도 있겠지만 횟수까지 설정할 수는 없기에 나름 유용할 수 있다. 
(글을 쓰다보니 watch를 쓰는게 더 나을 것 같기도 하다..)

아래의 스크립트 이며 파라미터는 다음과 같다. 
$1 명령어
$2 반복 횟수
$3 interval (ms) 

 

- 사용법 :

$ ./repeat_command.sh "echo 'Hello World'" 5 500
#!/bin/bash

# 사용법을 표시하는 함수
function usage() {
    echo "Usage: $0 [command] [repeat count] [delay in milliseconds]"
    exit 1
}

# 파라미터가 3개가 아닌 경우 사용법 표시
if [ "$#" -ne 3 ]; then
    usage
fi

command_to_run=$1
repeat_count=$2
delay_milliseconds=$3

# 밀리세컨드를 초로 변환
delay_seconds=$(echo "scale=3; $delay_milliseconds/1000" | bc)

# 반복해서 명령어 실행
for (( i=1; i<=$repeat_count; i++ )); do
    eval "$command_to_run"
    sleep $delay_seconds
done



쓰다보니 watch와 다른게 뭔가 싶어 기능을 추가해보았다.
무려 4번째 파라미터..!
$4 검색하고자 하는 문자열.

이 네번째 파라미터는 앞서 반복해서 뭔가를 실행하고 그 결과로 출력되는 내용 중에 이 파라미터가 포함되어있다면 'output_시간.log' 파일을 생성한다.

- 사용법 :

./repeat_command.sh "echo 'Hello World'" 5 500 "Hello"
#!/bin/bash

# 사용법을 표시하는 함수
function usage() {
    echo "Usage: $0 [command] [repeat count] [delay in milliseconds] [search string]"
    exit 1
}

# 파라미터가 4개가 아닌 경우 사용법 표시
if [ "$#" -ne 4 ]; then
    usage
fi

command_to_run=$1
repeat_count=$2
delay_milliseconds=$3
search_string=$4

# 밀리세컨드를 초로 변환
delay_seconds=$(echo "scale=3; $delay_milliseconds/1000" | bc)

output_file="output_$(date +%Y%m%d%H%M%S).log"

# 반복해서 명령어 실행
for (( i=1; i<=$repeat_count; i++ )); do
    result=$(eval "$command_to_run")
    
    if echo "$result" | grep -q "$search_string"; then
        echo "$result"
        echo "$(date): $result" >> $output_file
    fi
    
    sleep $delay_seconds
done


멋지지 않은가 ? 
그냥 뭔가 삘 받아서 만들어둔 스크립트이니 이 세상 어딘가 이 스크립트가 필요한 사람이 있길 바라며..글을 마무리한다.

반응형
반응형

간단한 파일 탐색을 위한 스크립트를 작성해보았다.
막강한 명령어인 find를 기반으로 동작하고 몇가지 옵션을 간편하게 적용할 수 있도록 해둔 것으로 이해하면 좋을 것 같다.

사용은 아래와 같다. (script의 이름은 대충 finder라고 지어뒀으니 마음에 드는 이름으로 바꿔서 쓰시길)

./finder.sh 경로이름 -i include -i want -e exclude -e trash -f json -h -o result.txt

 

여러가지 옵션을 지원하는데 간단하게 설명해보자면

  • -i : include
    전체 경로에서 해당 키워드가 포함되는 라인만 출력 대상에 포함한다.
    해당 옵션은 복수 개를 사용할 수 있다.
    예를 들자면
    -i task -i net
    위와 같이 옵션을 설정한다면 경로 상 task 키워드와 net 키워드가 모두 포함된 줄을 출력 대상에 포함한다.

    (이 부분은 요구사항을 어떻게 정의하고 ux를 어떻게 제공할지에 따른 개발자 개인의 성향 차이가 있을 수 있다.
    여러 -i 옵션에 사용된 키워드 중 하나만 포함되도 출력되는 것을 원할 수도 있으나 원하는 파일을 찾는다는 기능에 집중해서 생각해보면 하나라도 포함되는 것을 출력하게 되면 그 결과가 집중되지 않고 발산될 수 있는 가능성이 있음을 알 수 있다. 따라서 모든 키워드가 포함되는것이 원하는 기능의 측면에서 더 적절할 것이라는 결론을 내릴 수 있었다.)
  • -e : exclude
    이 옵션은 말 그대로 제외하고자 하는 키워드를 설정하는 것이다.
    -i 옵션과 동일하게 복수개를 설정할 수 있지만 해당 옵션은 개별 적용이 됨을 이해해야 한다.
  • -h : 숨김 파일 포함
    해당 옵션을 명시적으로 설정하게 되면 숨김 파일을 출력 결과에 포함하게 된다. 기본값은 당연히 숨김 파일은 숨긴채로 결과를 출력한다.
  • -f : 출력 포맷 (json, plain)
    이 옵션은 많은 개선/발전이 필요하다. 솔직하게는 구색을 위해 끼워넣은 옵션이라고 보는 편이 좋다.
    각설하고 해당 옵션은 json 또는 plain 이라는 키워드를 값으로 받게 된다. plain은 find 를 해서 나온 결과와 동일하며 json은 결과물들을 json array 형태로 출력해준다. 계층적으로 표현해주기 위해서는 tree 명령어의 도움을 받을 수는 있으나 해당 패키지의 설치가 필요하기에 굳이 지원하지 않는 것으로 결정하였다. (해당 패키지 설치는 아주 쉬운 편이지만 본 블로그에서는 왠만해서는 그 어떤 의존성도 없는 스크립트들을 만들어볼 것이다.)
  • -o 결과물 저장
    출력 결과 내용을 파일로 저장하기 위한 옵션이다. 
#!/bin/bash

usage() {
  echo "Usage: $0 path [-i include]... [-e exclude]... [-o output] [-h] [-f format]"
  echo "Options:"
  echo "  path  The directory path to search in."
  echo "  -i    Include keyword in path (can be used multiple times)"
  echo "  -e    Exclude keyword from path (can be used multiple times)"
  echo "  -o    Output file path"
  echo "  -h    Search hidden files"
  echo "  -f    Output format: json or plain (default: plain)"
  exit 1
}

declare -a includes
declare -a excludes
output=""
hidden="false"
format="plain"

# Capture the search path first
path="$1"
shift

# If no path or it starts with '-', show usage
if [ -z "$path" ] || [[ "$path" == -* ]]; then
  usage
fi

while getopts "i:e:o:hf:" opt; do
  case $opt in
    i) includes+=("$OPTARG") ;;
    e) excludes+=("$OPTARG") ;;
    o) output="$OPTARG" ;;
    h) hidden="true" ;;
    f) format="$OPTARG" ;;
    \?) usage ;;
  esac
done

# Start constructing the find command
cmd="find '$path'"

# Handle hidden files
if [ "$hidden" != "true" ]; then
  cmd="$cmd ! -path '*/.*'"
fi

# Handle include keywords
if [ "${#includes[@]}" -gt 0 ]; then
  for keyword in "${includes[@]}"; do
    cmd="$cmd -path '*$keyword*'"
  done
fi

# Handle exclude keywords
for keyword in "${excludes[@]}"; do
  cmd="$cmd ! -path '*$keyword*'"
done

# Add the print command
cmd="$cmd -print"

# Handle format
case "$format" in
  json)
    cmd="$cmd | sed 's/^/\"/' | sed 's/$/\",/' | (echo '['; cat; echo ']')"
    ;;
  plain)
    ;; # Nothing to do here, as the default is to just print
  *)
    ;; # Default case: just print
esac

# Handle output
if [ -n "$output" ]; then
  cmd="$cmd > '$output'"
fi

eval "$cmd"

 

반응형
반응형

23.11.29
해당 포스트를 방문하시는 분들이 많은 것 같은데, 제 생각에는 큰 도움이 안 될 것 같습니다.

그냥 jq 설치해서 쓰시는 것을 추천드립니다... (굳이 셀프로 훼방 놓기)

  • jq 설치 방법
sudo apt install jq

 

이하 본문입니다.

 

bash  스크립트 상에서 grep 을 이용하여 JSON 파일을 파싱하는 방법에 대해 알아보았다.
단순한 형태의 JSON 상에서 원하는 Key를 통해 Value 를 얻는 방법이며, 간단한 스크립트 작성을 하면서 임시로 사용하기 위한 방법을 조사한 것으로 복잡한 JSON 에서의 활용 가능성 여부는 확인하지 않았다.

json 파일

{
  "animal": [
    {
      "type": "dog",
      "name": "noname",
      "action": "bark",
      "home": "nowhere"
    }
  ]
}


bash script

JSON="path/to/json"
KEY="action"
action=$(grep -o "\"$KEY\": \"[^\"]*" $JSON | grep -o "[^\"]*$")

echo $action

output

bark

 

반응형

'Spadeworks > bash' 카테고리의 다른 글

[bash] 파일 크기 순으로 검색  (0) 2023.12.12
[bash] 명령어 반복  (0) 2023.09.19
[bash] 파일 탐색  (0) 2023.09.10
[bash] 특정 길이의 무작위 문자열 획득  (0) 2022.08.11
[bash] 프로세스 존재 여부 확인  (0) 2022.08.11
반응형

bash 스크립트 상에서 random/uuid 를 활용하여 무작위 문자열을 생성하는 방법에 대해 알아보았다.

 

여기서 UUID란 Universally Unique IDentifier라는 뜻으로

범용적인 목적의 각 개별을 식별할 수 있는 식별자라는 의미이다.

 

/usr/bin/uuidgen 의 바이너리를 이용하여 UUID를 획득하는 방법도 있지만

/proc/sys/kernel/random/uuid의 값을 참조하는 방법을 사용하였다.

 

아래의 스크립트에서 변수 LENGTH는 생성할 문자열의 길이를 정의한다.

#!/bin/bash

LENGTH=8
cat /proc/sys/kernel/random/uuid | sed 's/[-]//g' | head -c $LENGTH; echo;

 

반응형

'Spadeworks > bash' 카테고리의 다른 글

[bash] 파일 크기 순으로 검색  (0) 2023.12.12
[bash] 명령어 반복  (0) 2023.09.19
[bash] 파일 탐색  (0) 2023.09.10
[bash] bash를 이용한 json 파일 파싱  (0) 2022.08.11
[bash] 프로세스 존재 여부 확인  (0) 2022.08.11
반응형

bash 스크립트를 통해 주어진 이름의 프로세스가 시스템 상에서 동작 중인지 확인하는 bash 스크립트 구현에 대해 알아본다.

 

여기서 이용한 것은 pgrep 이라는 명령어 이다.

pgrep 에 대해 linux man page에 기재되어 있는 내용을 간단히 살펴보면 아래와 같다.

  • pgrep : looks through the currently running processes and lists the process IDs which match the selection criteria to stdout. All the criteria have to match

 

- 시스템 상 특정 프로세스가 구동 중인지 확인하기 위한 bash 스크립트로 pgrep을 활용하는 방법

#!/bin/bash

PROC="some_process"
if pgrep -f "PROC" >/dev/null
then
    echo "$PROC is running"
else
    echo "$PROC is not running"
fi
반응형

'Spadeworks > bash' 카테고리의 다른 글

[bash] 파일 크기 순으로 검색  (0) 2023.12.12
[bash] 명령어 반복  (0) 2023.09.19
[bash] 파일 탐색  (0) 2023.09.10
[bash] bash를 이용한 json 파일 파싱  (0) 2022.08.11
[bash] 특정 길이의 무작위 문자열 획득  (0) 2022.08.11

+ Recent posts