用于循环目录中的文件

时间:2015-09-28 17:46:05

标签: shell for-loop

我试图遍历目录中的所有文件和

  1. 将它们移动到工作区(我需要这样做,因为工作区没有太多存储空间)。
  2. 运行一个程序,该程序生成一个输出目录,其中包含我将来要使用的所有文件
  3. 从工作区中删除原始文件(以节省工作区中的空间)和
  4. 将输出目录移出工作区并返回存储空间
  5. 我能够单独为每个文件执行此操作(即,如果我实际使用文件的名称,每行都可以工作),但我无法使for循环工作。我对此很陌生,所以我可能做了一些简单的错误。

    谁能看到我哪里出错了?

    for i in path_to_files; do
    
        #copy to home directory (from scratch)
        cp $i .
    
    
    
        #Run IDBA
        idba_ud -l $i -o '$i'_out
    
        #remove file from work directory (limited space)
    
        rm $i
    
        #copy out directory back to scratch 
        cp -r '$i'_out path_to_files
    
    done
    

    我一直收到错误消息

      

    意外标记`cp'附近的语法错误。

    我也尝试用copy和i / $ i替换cp而没有运气。

1 个答案:

答案 0 :(得分:0)

如果这确实是 POSIX兼容shell (你的代码看起来很可疑,但你还没有指定实际使用的shell),那么:

  • 如果文件名包含空格或其他奇怪的字符,则始终引用文件名:

  • 但你应该使用单引号,因为这会阻止shell扩展你的变量。

  • 将文本附加到替换变量时,请使用${}表示法(例如,如果$i扩展为" murgel",则${i}foo将扩展为&# 34; murgelfoo",而$ifoo将扩展为""(空字符串)如果没有变量ifoo

这样试试:

filepath=/path/to/files

for i in "${filepath}"/*; do
    #copy to home directory (from scratch)
    cp "${i}" .
    #Run IDBA
    idba_ud -l "${i}" -o "${i}_out"
    #remove file from work directory (limited space)
    rm $i
    #copy out directory back to scratch 
    cp "${i}_out"/* "${filepath}"/
done