我有多个文件和一个非常长的命令列表。我无法一次全部运行它们,所以我需要一种聪明的方式来读取和执行文件以及完成后删除命令。执行并删除文件中的命令
到目前为止,我已经尝试
for i in filename.txt ; do ; execute $i ; sed -s 's/$i//' ; done ;
,但它不工作。在我介绍sed
之前,$i
正在执行。现在即使这样也行不通。
我想到了一个解决方法,我将读取第一行并删除第一行,直到文件为空。
任何更好的想法或命令?
我有多个文件和一个非常长的命令列表。我无法一次全部运行它们,所以我需要一种聪明的方式来读取和执行文件以及完成后删除命令。执行并删除文件中的命令
到目前为止,我已经尝试
for i in filename.txt ; do ; execute $i ; sed -s 's/$i//' ; done ;
,但它不工作。在我介绍sed
之前,$i
正在执行。现在即使这样也行不通。
我想到了一个解决方法,我将读取第一行并删除第一行,直到文件为空。
任何更好的想法或命令?
这应该适合你,list.txt是包含命令的文件。
请确保在运行前备份命令文件。
while read line; do $line;sed -i '1d' list.txt;done < "list.txt"
sed -i编辑就地这样list.txt将沿着循环改变,你将最终得到一个空文件。
我想你想要做的是这样的:
while read -r -- i; do $i; sed -i "0,/$i/s/$i//;/^$/d" filename.txt; done < filename.txt
文件被读入循环。每行都被执行,并且sed命令将只删除找到的第一个条目,然后删除空行。
当文件也被读取时会发生什么?目前尚不清楚行为是否明确。 – 2014-12-19 06:11:44
文件被更改,但sed命令确保只删除执行的命令。你可以在一些代码上测试它。 – jan 2014-12-19 06:16:17
我在从命令文件中删除任何东西时遇到问题。即使执行了几百行后,源文件仍然是原始大小 - 所有行仍然存在。我必须在Mac OS X上使用'-i.bak';备份后缀是强制性的。所以,我仍然坚信。 – 2014-12-19 06:29:08
我认为有一种方法是让所有命令的源文件都被执行,并且执行这些命令的脚本还会写入第二个日志文件,这些文件会在执行时列出这些文件。 如果您需要恢复该过程,您将处理源文件中不存在于日志文件中的行。
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
您可能想通过提供示例来澄清您要求的内容。 – EJK 2014-12-19 05:39:11
为什么不能一气呵成呢?文件中的命令将按顺序执行。脚本运行时您是否担心崩溃?你运行的命令有多复杂?他们都是单行命令吗?它们涉及I/O重定向吗? – 2014-12-19 06:01:20
另外,'excecute'的意义是什么?据推测,这是'execute'的拼写错误,但它是你系统上的一个特殊命令吗?它不是标准的Unix命令。 shell中有一个'exec',但你可能不想使用它。 – 2014-12-19 06:13:42