在bash中查找所有扩展名以结尾的文件

时间:2018-09-06 23:39:03

标签: bash

编写一个接受两个参数的bash脚本:目录和扩展名。 必须打印脚本以stdout目录中所有文件的路径(并且, (其子目录递归地)以扩展名结尾。

到目前为止,我有:

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

当我给它2个参数时,似乎什么都没有找到。

3 个答案:

答案 0 :(得分:3)

此脚本应该可以解决问题:

#!/bin/bash

find "$1" -type f -name "*.$2"

运行脚本的示例:

/bin/bash script.sh /srv/directory css
/bin/bash script.sh '/srv/directory with space' css

答案 1 :(得分:2)

您在此处似乎没有使用参数。

您应该使用$ 1和$ 2替换扩展名和目录,以使用参数1和2。

另外,您好像忘了关闭引号...并且目录中的花括号看起来不正确...我认为您需要在花括号中加上引号。

(抱歉,目前无法测试结果)。

答案 2 :(得分:2)

在这个答案中,我只是对Viktor的代码做一些解释。

此说明可能会对正在学习bash的人有所帮助。在我发布了“空间问题”部分之后,在我完成编写并保存该解释之前,Viktor更新了他的答案。这就是我所希望的。

这非常简洁,并且有很好的解释。原始代码为:

#!/bin/bash
#@filename: script.sh

find $1 -type f -name "*.$2"

听起来问题似乎来自某种作业,并且我想像这个原始代码可能满足了作业的期望。它可能也可以与您要编写的大多数程序一起使用,如果问题不是来自作业的话,这尤其重要。

我经常在Windows或Cygwin上进行开发,因此遇到带空格的路径和文件名。如果我在Cygwin上使用@Viktor的代码(请注意,当我在Linux上使用Viktor的代码时也会发生相同的行为)

$ pwd
/home/me

#Write the program
$ vim script.sh

#view the program
$ cat script.sh
#!/bin/bash

find $1 -type f -name "*.$2"


#Create a path with spaces in one of the directory names
#Name it after Viktor, for the great answer
CORP+dblack@CAP-D-ENG-INT3 ~
$ mkdir -p viktor/dir\ with\ spaces/directory

#put some css files in that directory
$ touch viktor/dir\ with\ spaces/directory/a.css

$ touch viktor/dir\ with\ spaces/directory/b.css

$ touch viktor/dir\ with\ spaces/directory/c.css

# run Viktor's code, using the well-written instructions
$ /bin/bash ./script.sh 'victor/dir with spaces/directory' css
find: ‘viktor/dir’: No such file or directory
find: ‘spaces/directory’: No such file or directory

请注意,由于我没有将./script.sh设置为可执行文件,因此我使用script.sh而不是普通的script.sh。如果我第一次运行,我可以按Viktor所示运行它

$ chmod +x script.sh

问题来自bash shell和find命令处理空格的方式。将第一个参数简单地指定为$1时,就不会对空格进行特殊处理。那可能不是描述事物的最佳方式。解释这个概念的更好方法也许是证明bash将分配以下内容。

$0='script.sh'
$1='viktor/dir with spaces/directory'
$2='css'

即使我们告诉bash我们的目录中有空格,也会发生这种情况

$ /bin/bash script.sh viktor/dir\ with\ spaces/directory css
find: ‘viktor/dir’: No such file or directory
find: ‘spaces/directory’: No such file or directory

这可以通过添加行echo "\$0 is $0"echo "\$1 is $1"echo "\$2 is $2"以及其他带有$(insert_number_here_but_no_parentheses)的行来看到。

那么,我们如何解决这个问题?让我们看一下find

的手册页
$ man find

# (press 'q' to get out of the display of the man page)

好的,那有点吓人。

让我们将原始的大纲剪裁到

find  [starting-point...] [expression]

DESCRIPTON在其“起点”说明中的意思是[starting-point...]是一个目录(或多个目录),您将从该目录开始搜索。现在,仅以“表情”一词来限制搜索即可。在您的情况下,您只查找文件,然后通过指定文件具有特定文件扩展名来进一步过滤结果。

让我们回到find $1 -type f -name "*.$2"命令。这里要知道的要点是,这里显示的命令将扩展为

find viktor/dir with spaces/directory -type f -name "*.css"

“空间问题”是find和外壳将按以下方式解释

find victor/dir with spaces/directory -type f -name "*.css"
 |     \         |      \             `--------------------'
 |      \        |       \              /
 |       |       |        \       Another '[expression]' (2)
 |       |       |         -- Another '[starting-point]'
 |       |        -- '[expression]' (1)
 |        -- '[starting-point]' (supposedly a directory)
  -- Command name

请注意,我们的'[expression]' (1)'[expression]' (2)并未考虑会发生什么,因为两个'[starting-place]'路径均失败。

Viktor代码中现在显示的内容

#!/bin/bash
#@filename viktor_script.sh

find "$1" -type f -name "*.$2"

通往

find "viktor/dir with spaces/directory" -type f -name "*.css"
`--' `--------------------------------' `-------------------'
 |               |                             /
 |               |             valid '[expression]' to define
 |               |             a "filter" for files outputted
 |               |
 |                -- '[starting-point]' (a real directory)
 |                    bash knows to include the spaces because
  -- command name                    of the quotation marks

让我们运行它,首先确保它是可执行的

$ chmod +x viktor_script.sh

$ /bin/bash ./viktor_script.sh css

$ /bin/bash viktor_script.sh 'viktor/dir with spaces/directory' css
viktor/dir with spaces/directory/a.css
viktor/dir with spaces/directory/b.css
viktor/dir with spaces/directory/c.css