【问题标题】:Iterate through folder files in Ubuntu 16遍历 Ubuntu 16 中的文件夹文件
【发布时间】:2018-08-06 13:52:36
【问题描述】:

我正在尝试遍历特定文件夹中的一些文件以在每个文件中执行特定操作(使用神经成像工具 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 中做到这一点,所以我猜这可能是问题的根源......

【问题讨论】:

    标签: bash shell centos ubuntu-16.04


    【解决方案1】:

    你需要一个shell glob:

    $ for i in /home/Desktop/MSc/ImagensMRI/T1/t1inciais/t1alzheimer/*; do 
        bet "$i" "${i}_brain" -f 0.4 -g 0
    done
    

    【讨论】:

      【解决方案2】:

      将-exec 选项用于find:

      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
      

      【讨论】:

      • @GillesQuenot 很好。已用 $i 修复 --> {}。
      【解决方案3】:

      您的脚本应该可以进行以下调整:

      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。

      这里的答案解释了why the $ in IFS=$'\n' is necessary。

      【讨论】:

      • 所有变量周围缺少双引号。如果引用得当,她的名字中有空格的文件没有问题
      • @GillesQuenot 正如我所说:一次性脚本应该在所有文件名都是良性的假设下工作。 OP 使用不带引号的$i,因此我假设文件的名称类似于mriscan00001.png 到mriscan12345.png。但是,是的,你是对的,它非常脆弱。非常脆弱。
      • 不是每次都引用它们的好理由(除了 int 值)
      • @GillesQuenot 这应该稍微好一点,我希望?或者 IFS 会做一些有趣的事情吗?
      • 是的,现在好多了。不需要IFS
      猜你喜欢
      • 2017-04-03
      • 1970-01-01
      • 2023-03-03
      • 1970-01-01
      • 2023-01-20
      • 2014-09-28
      • 2019-05-08
      • 1970-01-01
      相关资源
      最近更新 更多