如何将目录的这一部分组织并剪切成文件?

如何将目录的这一部分组织并剪切成文件?

我的主要目标是复制目录的内容并将其发送到文件。然后剪切目录位置以仅包含名称。然后整理它的内容,但大多数都出现了。这也是作业,我的限制是它必须是一个命令

这就是我认为可以完成的工作,但事实并非如此

wc -l ~location/folder/folder/*.log > ~/log.info | cut -d "/" -f9 ~/log.info | sort

我的输出

1 /s/s/s/s/location/folder/folder/a.log
1 /s/s/s/s/location/folder/folder/b.log
1 /s/s/s/s/location/folder/folder/c.log
3 /s/s/s/s/location/folder/folder/d.log
2 /s/s/s/s/location/folder/folder/e.log

我想要什么

1 a
1 b
1 c
2 e
3 d

答案1

您可以通过管道输出来去除所有不需要的位sed

wc -l ~location/folder/folder/*.log > ~/log.info
cut -d "/" -f9 ~/log.info | sort | sed 's_/.*/__;s_\.log$__'

答案2

怎么样:

perl -e 'print sort map {s/(\d).*(\w)\..*//r} <>' 

(需要 perl 5.14+ - 这可能已经安装在您的系统上)

使用一段内联的 Perl 代码:

  • 读取<>STDIN 或命令行上指定的文件。
  • 使用替换正则表达式捕获 a 之前的数字(\d)和字母. (\w)\.
  • 然后返回转换后的字符串。r正则表达式标志。
  • 用于map迭代STDIN.
  • sort......好吧,排序。
  • print打印它。

输出:

1 a
1 b
1 c
2 e
3 d

或者:

perl -e '%x=map {open($f,'<',$_); @f=<$f>; $_=>''.@f} @ARGV;print "$x{$_} $_\n" for sort {$x{$a}<=>$x{$b}} keys %x;' ~location/folder/folder/*.log 

答案3

wc … > ~/log.info | cut ~/log.info | …

管道的两侧平行执行。除非wc完成得特别快并且cut开始得特别慢,否则在cut读取时~/log.info,它很可能仍然是空的,甚至不存在。使问题更加复杂的是,重定向sort也是并行执行的,并且还会截断文件。

我不明白你想用这个中间临时文件做什么。它没有用:

wc -l ~location/folder/folder/*.log | cut -d "/" -f9 | sort > ~/log.info

切换到目标目录会更简单:

{ cd ~location/folder/folder && wc -l -- *.log; } | sort > ~/log.info

相关内容