Shell脚本:对文件执行cmd,并附加文件名处理

时间:2011-01-21 13:28:03

标签: shell scripting

所以我将再次发布关于shell脚本的问题。

问题定义:对于目录下的所有文件,例如:

  • A_anything.txt,B_anything.txt,......

我想在每个脚本上执行一个脚本,比如'CMD',输出文件名为:

  • A_result.txt,B_result.txt,......

此外,在这些输出文件的第一行,我希望拥有原始文件的文件名

'find -exec'util似乎无法提取部分文件名。

有人知道这个问题的解决方案吗(shell,python,find等)?谢谢!

2 个答案:

答案 0 :(得分:2)

cd /directory
for file in *.txt ; do
    newfilename=`echo "$file"|sed 's/\(.\+\)_.*/\1_result.txt/`
    echo "$file" > "$newfilename" 
    your-command $file >> "$newfilename"
done

HTH

答案 1 :(得分:1)

嗯,有多种方法可以做到这一点(包括使用Perl,这就是座右铭),但我可能会这样写:

find . -name '[A-Z]_*.txt' -type f -print0 |
    xargs -0 modify_rename.sh

然后我会像这样编写脚本modify_rename.sh

#!/bin/sh
for file in "$@"
do
    dirname=$(dirname "$file")
    basename=$(basename "$file" .txt)
    leadname=${file%_*}
    outname="$dirname/${leadname}_result.txt"
    # Optionally check for pre-existence of $outname
    {
    # Optionally echo "$basename.txt" instead of "$file"
    echo "$file"
    # Does this invocation of CMD write to standard output?
    # If not, adjust invocation appropriately.
    CMD "$file"
    } > "$outname"
done

这种分离到单独脚本操作的优点是重命名/修改操作可以与搜索过程分开检出 - 这样可以降低使用错误命令切换整个目录结构的风险。

Bash有避免调用basenamedirname的工具,但这种符号是极度痛苦的;我发现命令名称的清晰度值得拥有。如果bash将它们作为内置函数实现,我会很高兴。还有很多其他方法可以获取文件的前缀;但是,这应该是安全的,即使存在文件或目录名称中的空格(制表符,换行符),因为仔细使用双引号。