2014-09-22 66 views
0

因此,我正在编写一个bash脚本,用于统计目录中的文件数并输出一个数字。该函数接受一个目录参数以及一个可选的文件类型扩展参数。在终端中找到工作,但在bash脚本中失败

我使用以下几行将dir变量设置为目录,将ext变量设置为将表示要计数的所有文件类型的正则表达式。

dir=$1 
[[ $# -eq 2 ]] && ext="*.$2" || ext="*" 

我遇到的问题,当我试图运行下面的行出现:

echo $(find $dir -maxdepth 1 -type f -name $ext | wc -l) 

运行脚本从终端工作时,我提供了第二个文件类型的说法,但失败时,我不“T。

[email protected]:~$ bash Documents/howmany.sh Documents/ sh 
3 
[email protected]:~$ bash Documents/howmany.sh Documents/ 
find: paths must precede expression: Desktop 
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression] 
0 

...我已经寻找这个错误,我知道这是与外壳扩大我通配符作为解释here的问题。我尝试过使用单引号,双引号和反斜杠来逃避星号,但似乎没有任何工作。特别有趣的是,当我尝试通过终端直接运行时,它工作得很好。

[email protected]:~$ echo $(find Documents/ -maxdepth 1 -type f -name "*" | wc -l) 
6 
+0

hm,在bash脚本中为我工作的时候,当我在一个cwd中切换“Documents”时 – cianius 2014-09-22 22:27:31

+3

您需要在find命令中引用'“$ dir”'。也许''$ ext“'也是。也有'**没有理由将'find'命令包装在'echo $(...)'中。 – 2014-09-22 22:29:29

+0

@ jm666如果你想查找输出到一行,然后使用'-printf'来告诉它做到这一点。不要滥用shell的空白处理。但是,是的,当然有些时候可以故意使用shell的行为。 – 2014-09-22 23:13:04

回答

4

简体:

dir=${1:-.}   #if $1 not set use . 
name=${2+*.$2}  #if $2 is set use *.$2 for name 
name=${name:-*}  #if name still isnt set, use * 

find "$dir" -name "$name" -print #use quotes 

name=${2+*.$2}  #if $2 is set use *.$2 for name 
find "${1:-.}" -name "${name:-*}" -print #use quotes 

也,如@约翰Kugelman说,你可以使用:

name=${2+*.$2} 
find "${1:-.}" ${name:+-name "$name"} -print 

find . -name "*" -print相同find . -print,所以如果没有设置$name,没有必要指定-name "*"

+0

@JohnKugelman不错!已编辑并添加... :) – jm666 2014-09-22 23:16:07

0

试试这个:

dir="$1" 
[[ $# -eq 2 ]] && ext='*.$2' || ext='*' 

如果不工作,你可以切换到if语句,这样你在一个分支使用-name模式,你在其他不。

一对夫妇更点:

  • 这些都不是正则表达式,而是外壳的图案
  • echo $(command)正好相当于指令
+0

不应该改变任何东西,因为'*'没有用双引号扩展,并且在分配的右侧没有发生分词。 @EtanReisner在评论中指出,他确实需要在'find' /'echo'中引用引号。最后的好点。 – BroSlow 2014-09-22 22:48:24

+0

事实上,这些分配线上的引用不是问题。这些变量的使用是。但其他方面都很好。 – 2014-09-22 23:14:28

+0

好的,我不确定这会有效,这就是为什么我说“尝试”:)。 – SukkoPera 2014-09-23 08:51:14

相关问题