我需要我的脚本对当前目录中的每个文件执行某些操作(不包括任何子目录)。
例如,当前路径中有5个文件,但其中1个是文件夹(子目录)。我的脚本应该在运行所述脚本时激活作为参数给出的命令。即“bash script wc -w”应该给出当前目录中每个文件的字数,但不给出任何文件夹的字数,以便输出永远不会有任何“/sub/dir:是一个目录”行。
我当前的脚本:
#!/bin/bash
dir=`pwd`
for file in $dir/*
do
$* $file
done
我只需要排除循环的目录,但我不知道如何。
答案1
#!/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
答案2
如果您需要做的事情很简单(并且不涉及在主 shell &c 中设置变量),那么可以使用 for 循环的替代方法。
您可以使用find
with-exec
和 use-maxdepth 1
来避免递归到子目录中。
[ -n "$1" ] && find "$dir" -type f -mindepth 1 -maxdepth 1 -exec "$@" "{}" \;
这[ -n "$1" ]
是为了避免在脚本未传递任何参数时执行目录中的所有文件。
答案3
答案4
Bash for 循环排除子目录('/')和链接(@):
for f in `ls|egrep -v '/|@'`; do echo $f; done