Bash 遍历Ubuntu 16中的文件夹文件
我正在尝试遍历特定文件夹中的一些文件,以便对每个文件执行特定操作(使用神经成像工具FSL) 当我这样做的时候Bash 遍历Ubuntu 16中的文件夹文件,bash,shell,centos,ubuntu-16.04,Bash,Shell,Centos,Ubuntu 16.04,我正在尝试遍历特定文件夹中的一些文件,以便对每个文件执行特定操作(使用神经成像工具FSL) 当我这样做的时候 $ find /home/Desktop/MSc/ImagensMRI/T1/t1inciais/t1alzheimer/ 它返回该文件夹中所有文件的列表 所以我做了 $ for i in 'find /home/Desktop/MSc/ImagensMRI/T1/t1inciais/t1alzheimer/';do /usr/share/fsl/5.0/bin/bet $i ${i
$ find /home/Desktop/MSc/ImagensMRI/T1/t1inciais/t1alzheimer/
它返回该文件夹中所有文件的列表
所以我做了
$ for i in 'find /home/Desktop/MSc/ImagensMRI/T1/t1inciais/t1alzheimer/';do /usr/share/fsl/5.0/bin/bet $i ${i}_brain -f 0.4 -g 0;done
但结果是
Error: input image find not valid
我在CentOS 7中就可以做到这一点,所以我猜这可能是问题的根源 您需要一个shell glob:
您需要一个shell glob:
使用
-exec
选项查找
:
find /home/Desktop/MSc/ImagensMRI/T1/t1inciais/t1alzheimer/ -exec /usr/share/fsl/5.0/bin/bet {} {}_brain -f 0.4 -g 0 \;
对于喜欢将代码分散在多行的用户:
find /home/Desktop/MSc/ImagensMRI/T1/t1inciais/t1alzheimer/ \
-exec /usr/share/fsl/5.0/bin/bet {} {}_brain -f 0.4 -g 0 \;
例子
假设我们有一个包含以下文件的目录:
$ find .
.
./dir1
./dir1/file2
./dir1/file1
我们可以对这些文件中的每个文件运行echo
命令,显示文件名已正确替换为命令:
$ find . -exec echo bet {} {}_brain -f 0.4 -g 0 \;
bet . ._brain -f 0.4 -g 0
bet ./dir1 ./dir1_brain -f 0.4 -g 0
bet ./dir1/file2 ./dir1/file2_brain -f 0.4 -g 0
bet ./dir1/file1 ./dir1/file1_brain -f 0.4 -g 0
如果您只想在常规文件而不是目录上运行命令,请添加-type f
测试:
$ find . -type f -exec echo bet {} {}_brain -f 0.4 -g 0 \;
bet ./dir1/file2 ./dir1/file2_brain -f 0.4 -g 0
bet ./dir1/file1 ./dir1/file1_brain -f 0.4 -g 0
使用
-exec
选项查找
:
find /home/Desktop/MSc/ImagensMRI/T1/t1inciais/t1alzheimer/ -exec /usr/share/fsl/5.0/bin/bet {} {}_brain -f 0.4 -g 0 \;
对于喜欢将代码分散在多行的用户:
find /home/Desktop/MSc/ImagensMRI/T1/t1inciais/t1alzheimer/ \
-exec /usr/share/fsl/5.0/bin/bet {} {}_brain -f 0.4 -g 0 \;
例子
假设我们有一个包含以下文件的目录:
$ find .
.
./dir1
./dir1/file2
./dir1/file1
我们可以对这些文件中的每个文件运行echo
命令,显示文件名已正确替换为命令:
$ find . -exec echo bet {} {}_brain -f 0.4 -g 0 \;
bet . ._brain -f 0.4 -g 0
bet ./dir1 ./dir1_brain -f 0.4 -g 0
bet ./dir1/file2 ./dir1/file2_brain -f 0.4 -g 0
bet ./dir1/file1 ./dir1/file1_brain -f 0.4 -g 0
如果您只想在常规文件而不是目录上运行命令,请添加-type f
测试:
$ find . -type f -exec echo bet {} {}_brain -f 0.4 -g 0 \;
bet ./dir1/file2 ./dir1/file2_brain -f 0.4 -g 0
bet ./dir1/file1 ./dir1/file1_brain -f 0.4 -g 0
您的脚本应进行以下调整:
IFS=$'\n' for i in $(find /home/Desktop/MSc/ImagensMRI/T1/t1inciais/t1alzheimer/)
do
/usr/share/fsl/5.0/bin/bet "$i" "${i}_brain" -f 0.4 -g 0
done
$(…)
语法用于作为单独的命令启动find
,而不是创建字符串文字'find…'代码>
IFS
是分隔符,用于分割find
返回的结果。我们必须更新它,否则带有空格的文件名将分别分配给i
这里的答案说明了这一点。您的脚本应该进行以下调整:
IFS=$'\n' for i in $(find /home/Desktop/MSc/ImagensMRI/T1/t1inciais/t1alzheimer/)
do
/usr/share/fsl/5.0/bin/bet "$i" "${i}_brain" -f 0.4 -g 0
done
$(…)
语法用于作为单独的命令启动find
,而不是创建字符串文字'find…'代码>
IFS
是分隔符,用于分割find
返回的结果。我们必须更新它,否则带有空格的文件名将分别分配给i
这个答案解释了。所有变量都缺少双引号。她名字中有空格的文件没有问题quoting@GillesQuenot正如我所说的:一次性脚本应该在所有文件名都是良性的假设下工作。OP使用了$i
,没有引号,因此我假设文件的名称类似于mriscan00001.png
到mriscan12345.png
。但是是的,你是对的,它很脆。Veery脆性。不是一个不每次引用它们的好理由(除了int值)@GillesQuenot我希望这会稍微好一点?或者国际单项体育联合会做些有趣的事?是的,现在好多了。不需要在所有变量周围加双引号。她名字中有空格的文件没有问题quoting@GillesQuenot正如我所说的:一次性脚本应该在所有文件名都是良性的假设下工作。OP使用了$i
,没有引号,因此我假设文件的名称类似于mriscan00001.png
到mriscan12345.png
。但是是的,你是对的,它很脆。Veery脆性。不是一个不每次引用它们的好理由(除了int值)@GillesQuenot我希望这会稍微好一点?或者国际单项体育联合会做些有趣的事?是的,现在好多了。不需要IFS@GillesQuenot抢手货用$i
-->{}
@GillesQuenot解决了这个问题。用$i
-->{}
修复。