如何遍历目录并仅显示文件名

时间:2019-08-18 12:13:38

标签: bash

我想遍历目录的内容并仅列出普通文件。 目录的路径作为用户输入给出。如果输入是当前目录,但不能与其他目录一起使用,则脚本可以工作。 我知道可以使用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

4 个答案:

答案 0 :(得分:0)

ls仅返回文件名,不包括路径。您需要:

  1. 将工作目录更改为相关路径,或者
  2. 用您的-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?

相关