2011-05-08 123 views
273

我试图在我的bash(最新Ubuntu LTS发行版)目录及其子目录中查找具有特定扩展名的所有文件。递归查找具有特定扩展名的文件

这是什么写在一个脚本文件:

#!/bin/bash 

directory="/home/flip/Desktop" 
suffix="in" 

browsefolders() 
    for i in "$1"/*; 
    do 
    echo "dir :$directory" 
    echo "filename: $i" 
    # echo ${i#*.} 
    extension=`echo "$i" | cut -d'.' -f2` 
    echo "Erweiterung $extension" 
    if  [ -f "$i" ]; then   

     if [ $extension == $suffix ]; then 
      echo "$i ends with $in" 

     else 
      echo "$i does NOT end with $in" 
     fi 
    elif [ -d "$i" ]; then 
    browsefolders "$i" 
    fi 
    done 
} 
browsefolders "$directory" 

不幸的是,当我开始在终端这个脚本,它说:

[: 29: in: unexpected operator 

(与'in'$extension代替)

这是怎么回事,错误在哪里? 但这个大括号

+1

的错误是由缺少“{” – shrewmouse 2014-11-20 14:11:44

+1

你可以标记一个答案是正确的? – 2017-12-14 09:04:09

回答

508
find $directory -type f -name "*.in" 

比整个事情(更安全 - 涉及的文件名和目录名空格)短了一点。

您的脚本可能会因其名称中没有.的条目而失败,从而使$extension为空。

+0

这也是递归的吗? – flip 2011-05-08 12:26:40

+5

是的,'find'默认是递归的。如果需要,可以限制深度(请参见手册页)。 – Mat 2011-05-08 12:27:13

+1

我想将所有找到的文件作为参数传递给jar文件。这怎么能被执行? – flip 2011-05-08 12:31:13

9
  1. 有一个{browsefolders()
  2. 所有$in失踪应该是$suffix
  3. cut线让你只front.middle.extension中间部分。您应该阅读${varname%%pattern}和朋友的shell手册。

我假设你这样做是作为shell脚本的练习,否则已经提出的find解决方案是要走的路。

要检查正确的shell语法,而不运行脚本,请使用sh -n scriptname

51

我使用的语法比什么@马特建议有点不同:

find $directory -type f -name \*.in 

(它少了一个按键)。

+1

如果在当前目录中有扩展名为.in的文件,则Matt的脚本也不会工作,而您的工作仍然可用。看到http://stackoverflow.com/questions/5927369/recursively-look-for-files-with-a-specific-extension#comment22990599_5927391 – Shnatsel 2013-04-19 09:25:56

+4

@Shnatsel这个评论(因此你的)是明显错误的。 – 2015-02-19 12:46:59

+1

@gniourf_gniourf您应该为您的陈述提供一些参考,否则可以简单地争辩:“不,你错了”。但实际上你是对的:https://www.gnu.org/software/bash/manual/html_node/Double-Quotes.html – Murmel 2016-06-14 08:46:53

71
find {directory} -type f -name '*.extension' 

例如 寻找当前目录中的所有CSV文件

find . -type f -name '*.csv' 
5

要找到所有的pom.xml文件在当前目录中,并打印出来,你可以使用:

find . -name 'pom.xml' -print 
-1
find $directory -type f -name "*.in"|grep $substring 
9

不使用find

du -a $directory | awk '{print $2}' | grep '\.in$' 
+3

'grep'在这里并不是真的需要。 'awk'具有正则表达式,并且可以将其输出限制为匹配模式的值。 – Kenster 2016-03-05 17:57:14

+0

如果你的数据量达到100兆字节,这种方法非常有用。查找命令需要太多时间来处理。这立即开始。 – Protonova 2017-02-11 00:59:11

+0

'awk | grep'是一种反模式。让awk去做一下。 – Jens 2017-06-30 16:50:30

相关问题