shell - 我可以做一个循环而不是两个循环吗?
问题描述
我在 ${MY_DIR} 有一个文件列表。
ABC_foo123.txt
ABC_foo456.txt
ABC_bar100.txt
需要对这些文件做一些操作。
我的代码:
#!/usr/bin/ksh
ls -l ${MY_DIR}/ABC_foo*.txt
RV=$?
if [[ $RV -eq 0 ]];then
echo "files found for processing"
for sFile in `ls -1 ${MY_DIR}/ABC_foo*.txt`
do
fileNameOnly=$(basename ${sFile})
echo processing $sFile
#Doing some operations here
done
else
echo "No foo files found to process"
fi
ls -l ${MY_DIR}/ABC_bar*.txt
RV=$?
if [[ $RV -eq 0 ]];then
echo "files found for processing"
for sFile in `ls -1 ${MY_DIR}/ABC_bar*.txt`
do
fileNameOnly=$(basename ${sFile})
echo processing $sFile
#Doing some operations here
done
else
echo "No bar files found to process"
fi
这是按预期进行的。但是,有没有一种方法可以使用一个循环而不是两个循环。我觉得我在做同样的事情两次。欢迎任何建议
解决方案
不确定ksh
,但bash
你可以这样做:
for sFile in ABC_{foo,bar}*.txt; do
在通用外壳中,您可以简单地执行以下操作:
for sFile in ABC_foo*.txt ABC_bar*.txt; do
要检查是否已处理任何文件,执行以下操作可能更清洁:
flag=0
for sFile in "${MY_DIR}"/ABC_foo*.txt "${MY_DIR}"/ABC_bar*.txt; do
flag=1
# process sFile
done
if test "$flag" = 0; then echo "error" >&2; done
使用 glob 可以防止由于过滤 的输出而产生的许多错误ls
,但可能会在非常大的目录(例如,具有数十万条目的目录)中遇到问题。如果这是一个问题,您可能想查看find
.
推荐阅读
- javascript - 如何更新 useState 中的变量
- flutter - 自动隐藏状态栏
- google-bigquery - 附加辅助列时的 BigQuery GROUP BY 与 PARTITION BY
- python - 从 Python 中的字符串中提取抽象名词和形容词
- amazon-web-services - 当您将 Macbook 内容迁移到新 Mac 时,您的 AWS CLI 会发生什么情况?
- python - 如何在登录时验证用户名和密码,其中现有密码由存储在数据库中的 make_password 加密?
- node.js - Mongoose runValidators 无法使用 positional$ 处理 findOneandUpdate
- java - Flink 1.4.1 向 Job Manager 发送作业时随机响应 HTTP 500
- javascript - firebase web sign up with google 只有在第二次点击后才有效?
- python - 当输入是来自另一列的值时,将一列中的所有值作为 json 获取