Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 遍历Ubuntu 16中的文件夹文件_Bash_Shell_Centos_Ubuntu 16.04 - Fatal编程技术网

Bash 遍历Ubuntu 16中的文件夹文件

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

我正在尝试遍历特定文件夹中的一些文件,以便对每个文件执行特定操作(使用神经成像工具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}_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
-->
{}
修复。