循环浏览除目录之外的文件


11

我需要我的脚本对当前目录中的每个文件(不包括任何子目录)执行某些操作。

例如,在当前路径中,有5个文件,但其中1个是文件夹(子目录)。运行所述脚本时,我的脚本应激活作为参数给出的命令。即“ bash脚本wc -w”应提供当前目录中每个文件的字数,但不能提供任何文件夹的字数,因此输出永远不会包含“ / sub / dir:Is a directory”行。

我当前的脚本:

#!/bin/bash
dir=`pwd`
for file in $dir/*
do
    $* $file
done

我只需要为循环排除目录,但是我不知道如何。

Answers:


11
#!/bin/bash -

for file in "$dir"/*
do
  if [ ! -d "$file" ]; then
      "$@" "$file"
  fi
done

请注意,它也排除了符号链接类型的文件,并且符号链接解析为目录类型的文件(可能是您想要的文件)。

替代方法(从评论中),仅检查文件:

for file in "$dir"/*
do
  if [ -f "$file" ]; then
      "$@" "$file"
  fi
done

@roaima好主意!
laktak

2
更好地使用if [ -f "$file" ]; then ...。没有目录不仅会返回常规文件,还会返回套接字和符号链接。
JRFerguson

@JRFerguson基于OP的问题,我想说包含套接字和管道将是一个非常糟糕的主意。至于符号链接,它们已经隐式包含在其中! -d
roaima

我在最终脚本中使用了[-f $ file]。请注意,if条件中缺少引号。在我所看到的几乎所有地方,$ file都带有引号,但是为了使脚本正常工作,我必须删除它们。
TõnisPIIP

3

如果您需要做的事情很简单(并且不涉及在主shell&c中设置变量),这是使用for循环的替代方法。

您可以将findwith -exec和一起使用,-maxdepth 1以避免递归到子目录中。

[ -n "$1" ] && find "$dir" -type f -mindepth 1 -maxdepth 1 -exec "$@" "{}" \;

[ -n "$1" ]脚本可以避免在脚本未传递任何参数时执行目录中的所有文件。


2

在zsh中,可以使用glob限定符来按文件类型限制通配符匹配。例如,(.)在模式之后添加将其限制为常规文件。

wc -w *(.)

要处理以-或开头的文件名.,请使用wc -c -- *(.N)wc -c ./*(.N)。如果您还希望包括指向常规文件的符号链接,请进行设置*(-.)

其他常见的外壳程序没有这种功能,因此您需要使用一些不同的机制来按文件过滤,例如在循环或中测试文件类型find


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.