파일당 줄 수를 초과하면 특정 명령을 실행하는 조건을 설정하는 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
somedir
2023-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