使用ls -f过滤文件输出

时间:2014-02-09 13:49:31

标签: linux bash

我正在尝试编写一个bash脚本来检查文件是否是有效文件。 这是我正在使用的代码。

echo "Select your file"
read $TEST_FILE

for file in `ls $TEST_FILE`; do
    if [ -f $TEST_FILE ]; then
        echo "$TEST_FILE is a regular file" 
    fi
done

但我得到的结果就是这个。

 is a regular file
 is a regular file
 is a regular file
 is a regular file
 is a regular file

当我仅指定特定文件时,它列出了目录中的所有文件。我希望它能够为该1个文件吐出一个结果..

我该怎么做?

谢谢!

2 个答案:

答案 0 :(得分:4)

首先,您使用read错误地使用了变量 - 请勿使用$ - 当引用变量的现有值时,您只使用$ ,而不是分配一个值;代替:

echo "Select your file"
read TEST_FILE

如果假设$TEST_FILE是单个文字文件名,那么根本不需要for循环:

if [[ -f $TEST_FILE ]]; then
    echo "$TEST_FILE is a regular file" 
fi

如果假设$TEST是文件名模式,请注意以下内容:

for f in $TEST_FILE; do
    if [[ -f $f ]]; then
        echo "$f is a regular file" 
    fi
done

请注意,我正在使用更强大,更灵活的[[...]]而不是[...]构造进行测试。

<强>有感

OP提到了-f的{​​{1}}标记,其结果(可能取决于文件系统)未排序输出,包含以{开头的条目{1}}

相比之下,带有glob(文件名模式)的ls循环总是扩展为排序条目(据我所见)。 另外,要使globs与以.开头的条目匹配,必须设置for shell选项(.)。

答案 1 :(得分:1)

如果您只想检查一个文件,则下面应该有效:

test -f <the-file-path> && echo "regular file"

如果要检查目录中的常规文件,请按照以下步骤操作:

echo "Select your file"
read TEST_FILE

for fil in `ls $TEST_FILE`; do
    if [ -f $TEST_FILE/$fil ]; then
        echo "$TEST_FILE/$fil is a regular file" 
    fi
done