파일 이름을 증가시키기 위해 for 루프를 사용하여 bash 코드 if/else 조건을 단순화하는 방법

파일 이름을 증가시키기 위해 for 루프를 사용하여 bash 코드 if/else 조건을 단순화하는 방법

파일당 줄 수를 초과하면 특정 명령을 실행하는 조건을 설정하는 bash 스크립트를 만들고 있습니다.

파일 이름은 다음과 같습니다.

dir=/tmp

$dir/filename_$date_00.csv
$dir/filename_$date_01.csv
$dir/filename_$date_02.csv
$dir/filename_$date_03.csv
$dir/filename_$date_04.csv
$dir/filename_$date_05.csv
$dir/filename_$date_06.csv

유사한 개념으로 루프를 생성하고 싶습니다. (구문이 잘못된 것은 알지만 개념을 고려하십시오.)

if ["cat $dir/filename_$date_00.csv | wc -l" -gt 10]
then 
echo "sorry, cannot proceed"
else,
cat $dir/filename_$date_00.csv >> log..txt
fi

then loop until it reaches $dir/filename_$date_03.csv and ignore $dir/filename_$date_04.csv onwards

모든 것을 인쇄/반복하고 매우 긴 코드를 작성하는 대신 코드를 단순화하는 루프를 만들 수 있기를 바랍니다. 도와주세요. 감사합니다!

答え1

그게 내가하는 일이야. 먼저 모든 변수(대상 디렉터리 이름, 날짜, 최소 줄 번호, 최대 파일 수)를 명령줄 인수로 전달합니다. 그런 다음 처리된 각 파일에 대해 1씩 증가하는 변수를 사용합니다(행 수가 잘못된 파일을 계산해야 하는지 확실하지 않으므로 계산하고 있습니다). 이 같은:

#!/bin/bash

dir=$1
date=$2
max_files=$3
max_lines=$4

files_seen=0

for file in "$dir"/filename_"${date}"_*.csv; do
  if [[ "$files_seen" -lt "$max_files" ]]; then
    if [[ $(wc -l < "$file") -gt "$max_lines" ]]; then
      cat -- "$file" >> log.txt
    else
      echo "Sorry, cannot proceed with $file"
    fi
    (( ++files_seen ))
  fi
done

somedir2023-03-16 날짜와 일치하는 4개의 파일로 제한되고 최소 줄 번호가 10인 디렉토리의 파일에 대해 이 명령을 실행하려면 다음과 같이 스크립트를 실행할 수 있습니다.

script.sh somedir 2023-03-16 4 10 

이름에 숫자로 제한해야 하는 경우 다음을 사용할 수 있습니다.


#!/bin/bash

dir=$1
date=$2
max_files=$3
max_lines=$4

files_seen=0

for (( i=0; i<$max_files; i++ )); do
  ## zero-pad the number
  num=$(printf '%02d' "$i")
  file="$dir/filename_${date}_${num}".csv; 
  if [[ $(wc -l < "$file") -gt "$max_lines" ]]; then
    cat -- "$file" >> log.txt
  else
    echo "Sorry, cannot proceed with $file"
  fi
done

答え2

해결책은 다음과 같습니다.

#!/bin/sh
dir=/tmp                # Location
date=$(date +%Y%m%d)    # 20230316 for 16 March 2023

# Loop across the first four file numbers
for n in 0 1 2 3
do
    # Generate the matching file name
    file=$(printf "%s/filename_%s_%02d.csv" "${dir:-.}" "$date" $n)

    # Ensure the file exists and it has fewer than 10 lines
    if [ ! -f "$file" ] || [ $(wc -l <"$file") -gt 10 ]
    then
        echo "Sorry, cannot proceed ($file)" >&2
    else
        cat "$file" >>log.txt
    fi
done

関連情報