2014-12-19 69 views
1

我有多个文件和一个非常长的命令列表。我无法一次全部运行它们,所以我需要一种聪明的方式来读取和执行文件以及完成后删除命令。执行并删除文件中的命令

到目前为止,我已经尝试

for i in filename.txt ; do ; execute $i ; sed -s 's/$i//' ; done ; 

,但它不工作。在我介绍sed之前,$i正在执行。现在即使这样也行不通。

我想到了一个解决方法,我将读取第一行并删除第一行,直到文件为空。

任何更好的想法或命令?

+2

您可能想通过提供示例来澄清您要求的内容。 – EJK 2014-12-19 05:39:11

+0

为什么不能一气呵成呢?文件中的命令将按顺序执行。脚本运行时您是否担心崩溃?你运行的命令有多复杂?他们都是单行命令吗?它们涉及I/O重定向吗? – 2014-12-19 06:01:20

+0

另外,'excecute'的意义是什么?据推测,这是'execute'的拼写错误,但它是你系统上的一个特殊命令吗?它不是标准的Unix命令。 shell中有一个'exec',但你可能不想使用它。 – 2014-12-19 06:13:42

回答

0

这应该适合你,list.txt是包含命令的文件。

请确保在运行前备份命令文件

while read line; do $line;sed -i '1d' list.txt;done < "list.txt" 

sed -i编辑就地这样list.txt将沿着循环改变,你将最终得到一个空文件。

0

我想你想要做的是这样的:

while read -r -- i; do $i; sed -i "0,/$i/s/$i//;/^$/d" filename.txt; done < filename.txt 

文件被读入循环。每行都被执行,并且sed命令将只删除找到的第一个条目,然后删除空行。

+0

当文件也被读取时会发生什么?目前尚不清楚行为是否明确。 – 2014-12-19 06:11:44

+0

文件被更改,但sed命令确保只删除执行的命令。你可以在一些代码上测试它。 – jan 2014-12-19 06:16:17

+0

我在从命令文件中删除任何东西时遇到问题。即使执行了几百行后,源文件仍然是原始大小 - 所有行仍然存在。我必须在Mac OS X上使用'-i.bak';备份后缀是强制性的。所以,我仍然坚信。 – 2014-12-19 06:29:08

0

我认为有一种方法是让所有命令的源文件都被执行,并且执行这些命令的脚本还会写入第二个日志文件,这些文件会在执行时列出这些文件。 如果您需要恢复该过程,您将处理源文件中不存在于日志文件中的行。

logfile=commands.log 
srcfile=commands.src 
oldfile=commands.old 

trap "mv $oldfile $logfile; exit 1" 0 1 2 3 13 15 

[ -f $logfile ] || cp /dev/null $logfile 
cp $logfile $oldfile 

comm -23 $srcfile $logfile | 
while read -r line 
do 
    echo "$line" >> $oldfile 
    ($line) < /dev/null 
done 

mv $oldfile $logfile 
trap 0