bash循环文件操作,在命令之间传递临时名称

时间:2013-07-25 03:14:42

标签: bash

经过一天清理十几个不同文件中的500M记录后,我需要一些批量自动化,请:

  1. 有100个左右的名为HIST的文件?????? (HIST后最多6个字符)

  2. 我需要对每个操作进行四次操作:

     iconv -f US-ASCII -t UTF-8 %filename% - c -o %tempname1%   
     iconv -f UTF-8 -t UTF-8 %tempname1% -c -o %tempname2%   
     cat %tempname2% | tr -d '\r' > %morepermanentname%  
     sudo python blah.py %morepermanentname%
    
  3. 任何人都可以建议如何创建临时名称/从一行到另一行传递它们并为dir中的所有HIST *文件循环这个东西?

    这看起来不错吗?

    for f in HIST*
    do
        $temp1 = "temp1"
        $temp2 = "temp2"
        $semi = $f"perm"
        iconv -f US-ASCII -t UTF-8 "$f" -c -o "$temp1"
        iconv -f UTF-8 -t UTF-8 "$temp1" -c -o "$temp2"
        cat "$temp2" | tr -d '\r' > "$semi"
        sudo python blah.py "$semi"
     done
    

    请注意,带-c的iconf utf-8到utf-8看起来很奇怪,但已经抓到了一些东西。

3 个答案:

答案 0 :(得分:1)

您正在寻找for

for f in HIST*
do
  ./process "$f"
done

答案 1 :(得分:1)

编辑脚本:

for f in HIST*
do
    iconv -f US-ASCII -t UTF-8 "$f" -c -o "$f".tmp
    iconv -f UTF-8 -t UTF-8 "$f".tmp -c -o "$f".tmp2
    tr -d '\r' < "$f".tmp2 > "$f"perm
    sudo python blah.py "$f"perm
    rm "$f".tmp "$f".tmp2
done

如果您不希望保留原始副本而不是使用"$f",则显然可以在tr中使用相同的"$f"perm

  • 变量赋值=之间不应有空格。
  • 在完成作业时,不应使用$印章。
  • 引用变量。

答案 2 :(得分:1)

鉴于iconv的记录行为(当没有给出输入文件时从标准输入读取;写入标准输出),根本不需要显式的中间文件。

for file in HIST*
do
    semi="${file}perm"
    iconv -f US-ASCII -t UTF-8 -c "$file" |
    iconv -f UTF-8 -t UTF-8 -c |
    tr -d '\r' > "$semi"
    sudo python blah.py "$semi"
done

通过在使用时引用文件名变量,如果任何文件名包含空格,它也可以避免问题 - 而不是看起来很可能会出现问题。

我很好奇 - 为什么你需要blah.py脚本的root权限?它是将半永久文件复制到特权位置还是什么?您是否需要在sudo命令后删除半永久文件?