linux iterate over files in directory

w41d8nur  于 2022-11-28  发布在  Linux
关注(0)|答案(3)|浏览(92)

我尝试遍历目录中的每个文件。以下是我目前为止的代码。

while read inputline
do
  input="$inputline"
  echo "you entered $input";

if [ -d "${input}" ]
  then
    echo "Good Job, it's a directory!"

    for d in $input
      do
        echo "This is $d in directory."
      done
   exit

我的输出始终只有一行

this is $input directory.

为什么这个代码不起作用?我做错了什么?
好啊。当我回显的时候它会打印出来

$input/file

为什么要这样做呢?它不应该直接打印出没有目录前缀的文件吗?

2uluyalo

2uluyalo2#

如果你想稍微简化一下,去掉目录检查,你可以只写它来处理文件和目录,比如:

read inputline
ls "$inputline" | while read f; do
    echo Found "$f"
done
i34xakig

i34xakig3#

您可能会认为循环遍历文件很容易,对吗?但这在bash中充满了陷阱。
使用globs是最糟糕的。相信我,不要这样做

for x in *; do          # <--- bad for many reasons
    echo the file name is $x
done

例如,使用find更好。

for x in `find . -maxdepth 1 -type f`; do  # <-- assume no filename has spaces
    echo the file name is $x
done

find有很多选项可以按名称、按日期、按所有者...随便什么来过滤结果。它非常强大。
但是,如果文件名包含空格,则使用for-find会失败。要修复此问题,请使用...

while read x; do
    echo the file name is $x
done < <(find . -maxdepth 1 -type f)

或者,如果您不喜欢奇怪的done语法,您可以用途:

result=`find . -maxdepth 1 -type f`
while read x; do
    echo the file name is $x
done <<< $result

但是,如果文件名包含换行符怎么办?!会发生这种情况吗?是的,它会发生,但它是极其罕见的。所以,如果你是 PARANOID,你可以做:

while read -r -d '' x; do
    echo the file name is $x
done < <(find . -maxdepth 1 -type f -print0)

在我看来,额外的混乱是不值得的,所以我不建议这样做。人们谁把换行符在文件名应该感到痛苦。

相关问题