ディレクトリのこの部分をどのように整理してファイルに切り取ることができますか?

ディレクトリのこの部分をどのように整理してファイルに切り取ることができますか?

私の主な目的は、ディレクトリの内容をコピーしてファイルに送信することです。次に、名前のみを含めるようにディレクトリの場所を切り取ります。その後、コンテンツをクリーンアップすると、ほとんどが表示されます。これも課題です。私の制限は命令でなければならないということです。

これは可能だと思いましたが、できませんでした。

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

関連情報