编写一个接受两个参数的bash脚本:目录和扩展名。 必须打印脚本以stdout目录中所有文件的路径(并且, (其子目录递归地)以扩展名结尾。
到目前为止,我有:
find {directory} -type f -name ' *.extension *
当我给它2个参数时,似乎什么都没有找到。
答案 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