如何遍历从 ls 命令返回的一些文件名?
How can I iterate over some file names returned from ls command?
您好,我正在尝试编写一个简单的 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
使用通配符,将文件名存储到一个数组中,并遍历从 3 到 6(包括两者)的索引。请注意,数组索引在 bash
中从零开始。例如,使用 C 风格 for
loop
#!/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
您好,我正在尝试编写一个简单的 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
使用通配符,将文件名存储到一个数组中,并遍历从 3 到 6(包括两者)的索引。请注意,数组索引在 bash
中从零开始。例如,使用 C 风格 for
loop
#!/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