所以我将再次发布关于shell脚本的问题。
问题定义:对于目录下的所有文件,例如:
我想在每个脚本上执行一个脚本,比如'CMD',输出文件名为:
此外,在这些输出文件的第一行,我希望拥有原始文件的文件名。
'find -exec'util似乎无法提取部分文件名。
有人知道这个问题的解决方案吗(shell,python,find等)?谢谢!
答案 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有避免调用basename
和dirname
的工具,但这种符号是极度痛苦的;我发现命令名称的清晰度值得拥有。如果bash将它们作为内置函数实现,我会很高兴。还有很多其他方法可以获取文件的前缀;但是,这应该是安全的,即使存在文件或目录名称中的空格(制表符,换行符),因为仔细使用双引号。