在 bash 中使用 ls

在 bash 中使用 ls

我有一些这样的文件:

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

相关内容