如何通过后缀来处理文件

时间:2017-07-02 05:54:45

标签: bash path

我正在尝试将.nii文件(Gabor3.nii)路径复制到变量,但即使find命令找到该文件,我也无法将路径复制到该变量。

find . -type f -name "*.nii"
Data= '/$PWD/"*.nii"'

输出:

./Gabor3.nii
./hello.sh: line 21: /$PWD/"*.nii": No such file or directory

3 个答案:

答案 0 :(得分:2)

您可以使用命令替换:

Data=$(find . -type f -name "*.nii" -print -quit)

为了防止多行输出,-quit选项在找到第一个文件后停止搜索(除非您确定只找到一个文件或者您想要处理多个文件)。

答案 1 :(得分:2)

出了什么问题

您表明您正在使用:

Data= '/$PWD/"*.nii"'

空格意味着Data=部分将环境变量$Data设置为空字符串,然后尝试运行'/$PWD/"*.nii"'。单引号表示它们之间的内容未展开,并且您没有目录/$PWD(目录名称为$P,{ {1}},根目录中的W,因此找不到脚本D,因此出现错误消息。

使用数组

行;那是什么错。什么是对的?

你有几个选择。最可靠的是使用数组赋值和shell扩展:

"*.nii"

括号(注意Data=( "$PWD"/*.nii ) 之前没有空格 - 这是至关重要的)使它成为一个数组赋值。使用shell globbing可以正确地给出名称列表,保留名称中的空格等。在(周围使用双引号可确保扩展正确,即使当前目录名中有空格也是如此。

您可以在列表中找到有多少文件:

"$PWD"

您可以使用以下内容迭代文件名列表:

echo "${#Data[@]}"

请注意,对于包含空格的名称,变量引用必须是双引号才能正常工作。 for file in "${Data[@]}" do echo "File is [$file]" ls -l "$file" done 表示法与"${Data[@]}"相似,它还保留命令参数中的空格。有一个"$@"变种,其行为与"${Data[*]}"类似,价值也相似。

如果您担心可能没有任何带扩展名的文件,请使用"$*"将globbing表达式扩展为空列表,而不是未扩展的表达式,这是历史默认值。如有必要,您可以使用shopt -s nullglob取消设置选项。

替代

替代方法涉及使用命令替换shopt -u nullglob之类的事情,但这远远不如使用数组,除非Data=$(ls "$PWD"/*.nii)中的路径和文件名都不包含任何空格,制表符,换行符。如果名称中没有空格,则可以正常工作;你可以迭代:

$PWD

但是,如果周围有(或可能是)任何空白字符,则完全不太令人满意。

答案 2 :(得分:1)

执行您似乎尝试执行的操作的语法:

Data= '/$PWD/"*.nii"'

将是:

Data="$(ls "$PWD"/*.nii)"

不是说这是最好的方法,无论你想做什么,当然,它可能不是......