0

我正在远程处理集群并提供数千个工作。一些工作提前崩溃。我需要将这些作业的输出文件(小于 1KB)移动到另一个文件夹并重新启动它们。我猜 find 可以通过以下方式移动它们:

find . -size -1000c -exec mv {} ../crashed \;

但我还需要重新启动这些崩溃的作业。输出文件夹中一堆文件夹中的输出文件,我需要单独的文件夹名和文件名(不带扩展名)。

我猜 sed 或/和 awk 可以很容易地做到这一点,但我不知道怎么做。顺便说一句,我正在研究 BASH shell。

我正在尝试使用 cut,这似乎有效:

for  i in $( find . -size -1000c )
do
FOLDER=$(echo "${i%.*}" | cut -d'/' -f2)
FILENAME=$(echo "${i%.*}" | cut -d'/' -f3)
done

但是使用sedawk不是更好吗?如何?

4

1 回答 1

1

Sed 是一个流编辑器,由于您没有更改任何内容,因此在这种情况下我不会使用它。您可以像这样使用 awk 而不是 cut :

FOLDER=$(echo "${i%.*}" | awk -v FS="/" '{ print $2 }')

其中-v FS="/"指定变量 FS(字段分隔符,是一个斜杠,与您在 cut 中使用 -d 选项所做的相同)并print $2告诉 awk 仅打印第二个字段。

你那里的其他指令也是如此。在你的情况下,你要做的很简单,所以 cut 实际上会削减它:D

我通常将 awk 用于更复杂的任务,涉及多个文件和/或数学计算。

编辑:

请注意,我在这里使用 gawk(GNU 的 awk 实现)。我不确定您是否可以-v在其他实现中使用该选项传递变量值,他们会有自己的方式来做到这一点。

于 2013-06-05T09:20:47.843 回答