如何编写脚本来提示输入文件名以搜索并打印该文件名上的所有文件

如何编写脚本来提示输入文件名以搜索并打印该文件名上的所有文件

我必须编写一个脚本,提示用户输入文件名,然后打印系统上具有该文件名的所有文件。到目前为止,我的 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 选项dotglobnullglob确保 shell 通配模式与隐藏文件匹配,并且如果该模式不匹配任何内容,则该模式将被完全删除。

请注意,该脚本(如您尝试的代码)不会对常规文件、目录、符号链接或其他类型的文件进行任何区分。

测试这个脚本:

$ bash ~/script.sh .zshrc
Found "./.zsh/.zshrc"
Found "./skel/.zshrc"
$ cd /etc
$ bash ~/script.sh .zshrc
Found no file named ".zshrc"

如果没有这个脚本,设置failglobglobstarshell 选项bash将允许我们直接在命令行上有效地执行与脚本相同的操作:

$ shopt -s globstar failglob dotglob
$ echo ./**/.zsh
./.zsh
$ echo ./**/.zshrc
./.zsh/.zshrc ./skel/.zshrc
$ echo ./**/booo
bash: no match: ./**/booo

相关内容