我有一些这样的文件:
a.10 a.15 a.20 a.30 a.40 a.50
如果我想为所有人做同样的工作,我可以使用
for data in `ls a*| sort -n`
如果我想一件一件地做同样的工作。我可以用:
data=(`ls a* | awk '{print $1}'`)
numb=`ls a*|wc|awk '{print $1}'`
ii=0
for da in ${data[$ii]} ; do
echo ${data[$ii]}
ii=$(($ii+1))
done
但是我怎样才能对 ii 等于且大于 2 的文件做同样的工作,我的意思是像 ls 但不是所有的文件都只用于
a.20 a.30 a.40 a.50
答案1
ls
当扩展实际上是由 shell 完成时, 绝对没有理由解析输出。而不是这段代码:
for data in `ls a*| sort -n`
你可以使用这个:
for data in a*
即使您需要对其进行排序,也可以使用它(对于带有新行的文件名将失败):
for data in $( echo a* | sort -n )
使用多个值的最佳方法是将它们放入一个数组中。
具体来说,参数数组:
set -- a*
printf '<%s>' "$@"; echo
而你的代码来一项一项地完成一些工作就变得像这样简单:
#!/bin/bash
set -- a*
numb=$#
printf '%s ' "$@"
要根据文件的数量进行处理,您可以这样做:
#!/bin/bash
# using bash as the [[ is more robust.
set -- a* # set an array of all files that start by a
for file # walk the array one by one
do
[[ ${file#a\.} -le 20 ]] && continue # is the file number < 20
printf '%s\n' "$file" # do additional processing here
done
答案2
以下内容将处理与请求模式匹配的所有文件。但请注意,它还会匹配a.2y
现有的文件,而不仅仅是数字后缀:
for file in a.2?; do
#stuff with ${file}
done
如果您只想处理带有数字后缀的文件,则可以使用以下方法:
for file in a.2{0..9}; do
if [[ -f ${file} ]]; then # file exists
# stuff with ${file}
fi
done