나의 주요 목표는 디렉토리의 내용을 복사하여 파일로 보내는 것입니다. 그런 다음 이름만 포함하도록 디렉터리 위치를 잘라냅니다. 그런 다음 내용을 정리하면 대부분이 나타납니다. 이것도 과제입니다. 제 제한은 명령이어야 한다는 것입니다.
이게 가능할 줄 알았는데 안되더라구요
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 또는 명령줄에 지정된 파일을 읽습니다 .(\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