我如何迭代从ls命令返回的一些文件名?



你好,我想写一个简单的bash脚本,

我遇到的问题是,我想遍历从ls命令返回的第4、第5、第6和第7个文件,然后检查这些文件是否具有写或读权限,如果它们这样做,则将这些文件简单地复制到另一个目录。到目前为止,我所做的是检查它们是否具有所需的权限,如果有,则将它们复制到/tmp目录。我的解决方案:

#!/bin/sh

for f in *

do

if [ -w "$f" ] || [ -r "$f" ]; then

cp $f /tmp

fi

done

获得第4到第7个文件名的方法是通过ls | head -7 | tail -4,但是我如何仅通过这些文件名进行迭代?基本上,我怎么才能使*列表在for循环可以是这4个文件名?

非常感谢。

不要尝试解析ls的输出。参见为什么不应该解析ls

的输出使用globbing,将文件名存储到一个数组中,并迭代索引3到6(包括两个)。注意,在bash中,数组下标从0开始。例如,使用C样式的forloop

#!/bin/bash
files=(*)
for ((i = 3; i <= 6; ++i)); do
if [[ -r ${files[i]} || -w ${files[i]} ]]; then
cp "${files[i]}" /tmp
fi
done

或使用带有数组切片的传统for循环:

files=(*)
for file in "${files[@]:3:4}"; do
if [[ -r $file || -w $file ]]; then
cp "$file" /tmp
fi
done

或者,正如在注释中提到的,可以实现一个计数器来跳过前3个文件,并在第7次迭代后中断循环,而无需诉诸数组:

itr=0 # iteration count
for file in *; do
((++itr < 4)) && continue
((itr > 7)) && break
[[ -r $file || -w $file ]] && cp "$file" /tmp
done

如果此ls | head -7 | tail -4工作:

然后迭代ls命令的结果:

ls | head -7 | tail -4 | while read line
do
if [ -w "$line" ] || [ -r "$line" ]; then
cp $line /tmp
fi
done

最新更新