如何使用 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

我就是这样做的。首先,我会让所有变量作为命令行参数传递:目标目录的名称、日期、最小行号和最大文件数。然后,我将使用一个变量,该变量对于处理的每个文件都加一(尚不清楚是否应计算行数不正确的文件,因此我正在计算它们)。像这样的东西:

#!/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,限制为仅 4 个与日期 2023-03-16 匹配的文件,并且最小行号为 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

相关内容