Bash 如何通过后缀对文件进行寻址

Bash 如何通过后缀对文件进行寻址,bash,path,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 可以使用命令替换: Data=$(find . -type f -name "*.nii" -print -qui

我试图将.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

可以使用命令替换:

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

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

您可以使用命令替换:

Data=$(find . -type f -name "*.nii" -print -quit)
为了防止多行输出,在找到第一个文件后,
-quit
选项将停止搜索(除非您确定只找到一个文件或要处理多个文件)。

发生了什么问题 您表明您正在使用:

Data= '/$PWD/"*.nii"'
空格表示
Data=
部件将环境变量
$Data
设置为空字符串,然后尝试运行
'/$PWD/“*.nii”
。单引号表示它们之间的内容没有展开,并且在根目录中没有目录
/$PWD
(这是一个目录名
$
P
W
D
),因此在其中找不到脚本
“*.nii”
,因此出现错误消息

使用数组 嗯,;这就是问题所在。什么是对的

你有两个选择。最可靠的方法是使用数组分配和shell扩展:

Data=( "$PWD"/*.nii )
括号(请注意,
-这很关键)前面没有空格)使其成为数组赋值。使用shell globbing可以给出名称列表,正确地保留名称中的空格等。在
“$PWD”周围使用双引号
确保扩展正确,即使当前目录名中有空格

您可以通过以下方式了解列表中有多少文件:

echo "${#Data[@]}"
您可以使用以下命令迭代文件名列表:

for file in "${Data[@]}"
do
    echo "File is [$file]"
    ls -l "$file"
done
请注意,变量引用必须在双引号中才能正确使用带有空格的名称。
“${Data[@]}”
表示法与
“$@”
有相似之处,这也会在命令的参数中保留空格。
“${Data[*]}”
变量的行为类似于
“$*”
,具有类似的有限价值

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

选择 替代方法包括使用命令替换
Data=$(ls“$PWD”/*.nii)
,但这远不如使用数组,除非
$PWD
中的路径和文件名都不包含任何空格、制表符和换行符。如果名称中没有空格,则可以正常工作;您可以迭代:

for file in $Data
do
    echo "No white space [$file]"
    ls -l "$file"
done
但如果周围有(或可能有)任何空格字符,这就不太令人满意了。

出了什么问题 您表明您正在使用:

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

使用数组 好吧,这就是问题所在。什么是对的

您有两种选择。最可靠的方法是使用数组分配和shell扩展:

Data=( "$PWD"/*.nii )
括号(请注意,
-这很关键)前面没有空格)使其成为数组赋值。使用shell globbing可以给出名称列表,正确地保留名称中的空格等。在
“$PWD”周围使用双引号
确保扩展正确,即使当前目录名中有空格

您可以通过以下方式了解列表中有多少文件:

echo "${#Data[@]}"
您可以使用以下命令迭代文件名列表:

for file in "${Data[@]}"
do
    echo "File is [$file]"
    ls -l "$file"
done
请注意,变量引用必须在双引号中才能正确使用带有空格的名称。
“${Data[@]}”
表示法与
“$@”
有相似之处,这也会在命令的参数中保留空格。
“${Data[*]}”
变量的行为类似于
“$*”
,具有类似的有限价值

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

选择 替代方法包括使用命令替换
Data=$(ls“$PWD”/*.nii)
,但这远不如使用数组,除非
$PWD
中的路径和文件名都不包含任何空格、制表符和换行符。如果名称中没有空格,则可以正常工作;您可以迭代:

for file in $Data
do
    echo "No white space [$file]"
    ls -l "$file"
done

但是,如果周围有(或可能有)任何空格字符,这就不太令人满意了。

执行您似乎要执行的操作的语法:

Data= '/$PWD/"*.nii"'
将是:

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

不是说这是你下一步想做的事情的最佳方法当然,这可能不是…

你似乎想做的事情的语法:

Data= '/$PWD/"*.nii"'
将是:

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

当然,不是说这是你下一步想做的事情的最佳方法,它可能不是…

Data=$PWD/*.nii
但是你可能会有更多关于这件事的后续问题…同样的问题:./hello.sh:line 21:Data=$PWD/*.nii:没有这样的文件或目录
Data=($(find.-type f-name“*.nii”))
将为您提供