微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决如何迭代从 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 的输出。见Why you shouldn't parse the output of ls

使用 globbing,将文件名存储到一个数组中,并遍历从 3 到 6(包括两个)的索引。请注意,数组索引从 bash 中的零开始。例如,使用 C 风格的 for 循环

#!/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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。