Bash 如何通过后缀对文件进行寻址
我试图将.nii文件(Gabor3.nii)路径复制到变量,但即使文件是通过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
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”))
将为您提供