我想遍历目录的内容并仅列出普通文件。 目录的路径作为用户输入给出。如果输入是当前目录,但不能与其他目录一起使用,则脚本可以工作。 我知道可以使用ls ..完成此操作,但是我需要在控件结构中使用for..。
#!/bin/bash
echo "Enter the path:"
read path
contents=$(ls $path)
for content in $contents
do
if [ -f $content ];
then
echo $content
fi
done
答案 0 :(得分:0)
ls
仅返回文件名,不包括路径。您需要:
-f
测试的名称组合路径选项2将会改变:
if [ -f $content ];
收件人:
if [ -f "$path/$content" ];
请注意,这里还有其他问题; ls
可能会对输出进行更改以使此中断,具体取决于换行。如果您坚持使用ls
,则至少可以(通过某种方式)使其更安全:
contents="$(command ls -1F "$path")"
答案 1 :(得分:0)
您有两种正确执行此操作的方法:
循环遍历*模式和测试文件类型:
#!/usr/bin/env bash
echo "Enter the path:"
read -r path
for file in "$path/"*; do
if [ -f "$file" ]; then
echo "$file"
fi
done
或者使用find来迭代以空分隔的文件名列表:
#!/usr/bin/env bash
echo "Enter the path:"
read -r path
while IFS= read -r -d '' file; do
echo "$file"
done < <(
find "$path" -maxdepth 1 -type f -print0
)
首选第二种方法,因为它将正确处理带有特殊字符的文件,并将文件类型检查卸载到find命令。
答案 2 :(得分:0)
使用file
,设置为从$ path目录中搜索文件(-type f
):
find "$path" -type f
答案 3 :(得分:0)
这是您可以写的:
#!/usr/bin/env bash
path=
while [[ ! $path ]]; do
read -p "Enter path: " path
done
for file in "$path"/*; do
[[ -f $file ]] && printf '%s\n' "$file"
done
如果要递归遍历所有子目录以查找文件,则可以使用globstar:
shopt -s globstar
for file in "$path"/**; do
printf '%s\n' "$file"
done
如果您要根据一种或多种模式或某些其他条件来查找特定文件,则可以使用find
命令来选择这些文件。看到这篇文章:
How to loop through file names returned by find?