我必须编写一个脚本,提示用户输入文件名,然后打印系统上具有该文件名的所有文件。到目前为止,我的 script.sh 上有这个:
#!/bin/bash
echo "please enter filename"
read filename
if [ find . -name $filename ] //not sure if the condition is right
then
//print all files on the system with that file name
not sure what to put here
else
echo "file does not exist"
fi
请帮忙,谢谢!
答案1
你可以使用类似的东西:
#!/bin/bash
echo "please enter filename"
read filename
find . -name "$filename" | egrep '.*'
if [ "$?" -ne 0 ]
then
echo "file does not exist"
fi
答案2
对于使用 查找具有特定名称的所有文件的简单任务bash
,您不需要find
.对于您实际需要对找到的文件进行操作的情况,该find
实用程序更有用。
shellbash
有一个特殊的**
模式,可以“递归地”匹配子目录。通过设置 shell 选项来启用此模式globstar
。
#!/bin/bash
shopt -s globstar dotglob nullglob
pathnames=( ./**/"$1" )
if [[ ${#pathnames[@]} -gt 0 ]]; then
printf 'Found "%s"\n' "${pathnames[@]}"
else
printf 'Found no file named "%s"\n' "$1"
fi
这将扩展模式./**/"$1"
,它匹配当前目录或其下任意位置的脚本的第一个命令行参数对应的所有文件名。生成的路径名存储在数组中pathnames
。然后对该数组的长度进行测试,如果它包含某些内容(该数组的长度大于零),则打印该数组的元素。如果数组为空,则会打印一条消息。
shell 选项dotglob
和nullglob
确保 shell 通配模式与隐藏文件匹配,并且如果该模式不匹配任何内容,则该模式将被完全删除。
请注意,该脚本(如您尝试的代码)不会对常规文件、目录、符号链接或其他类型的文件进行任何区分。
测试这个脚本:
$ bash ~/script.sh .zshrc
Found "./.zsh/.zshrc"
Found "./skel/.zshrc"
$ cd /etc
$ bash ~/script.sh .zshrc
Found no file named ".zshrc"
如果没有这个脚本,设置failglob
和globstar
shell 选项bash
将允许我们直接在命令行上有效地执行与脚本相同的操作:
$ shopt -s globstar failglob dotglob
$ echo ./**/.zsh
./.zsh
$ echo ./**/.zshrc
./.zsh/.zshrc ./skel/.zshrc
$ echo ./**/booo
bash: no match: ./**/booo