俺の雑記帳

My random memorandumです。(つまり、個人的な備忘録であり、その点ご容赦を。)

容量削減作業で使ったLINUXコマンドを記録(ファイル名を置換し一意集計したり… sed, "$(…)", sort, uniq, find, ls,,,)

俺管理のLINUXサーバーの容量削減手順だが、
LINUXコマンド集を兼ねた、備忘録。 (前は調べる/考える手間を惜しむようなコマンドでも、今は、AI-LLM(今回はCopilot)で 少々複雑な処理でも すぐ適切なコマンドやその組み合わせを教えてくれるんで。)

コマンド集としてのサマリ

  • 文字列を置換[sed](sedはファイルinputが基本だが、パイプ("|")inputでコピペ文字列を変換): echo 'C:\Users\YourName\log\TeraTerm' | sed 's/\\/\//g'
  • コマンド引数に別のコマンド結果を使う["$(……)"]:cd "$(echo 'C:\Users\YourName\log\TeraTerm' | sed 's/\\/\//g')"
  • コマンド結果を数値順で並べる [sort]:du -mcs ./* | sort -nr
  • 結果から重複を削除し一覧(ついでに数える)[uniq]:・・・| sort | uniq -c
  • 直下のディレクトリだけ表示: ls -d */
  • 直下のファイルだけ表示: find . -maxdepth 1 -type f
  • 1文字ワイルドカードを活用し,マッチ数を数え間引き[?]:rm 2022???? -rfls 2023??30 -dls 2023??31 -drm 2023??30 -rf

以降は、容量削減作業としての解説。

BusyBoxでcdするためにパスの\を/に変換する

まず、以前のLINUX作業ログを、BusyBoxWindows上でLinuxコマンド(今回はfile ./ -name 容量―WinのFile Explorerの検索では検出できんかったんで-法則も分らん)を手軽に使う.exe)で探した。
その為に、File Explorerからpathをコピーし、cdしたが、\を/に変換する必要があった。
変換した結果を直接cdに使うのも、以下のコマンドのポイント。

cd "$(echo 'C:\Users\YourName\log\TeraTerm' | sed 's/\\/\//g')"
du結果の上位だけ表示(sort)

容量多いディレクトリを見つける俺おなじみのdu -mcs ./*。ただファイルが多いディレクトリ下だと困る。そこで sort を組み合わせる。

du -mcs ./* | sort -nr | head
ログファイル名中の日時部を抜き、ファイル名共通部を一覧

 例:以下のようなファイルが多数ある。

class]$ find . -maxdepth 1 -type f 
./OneIO_20240405-161601.357672.log  
./OneIO_20240405-161901.123456.log  
./AnotherIO_20240405-161601.333333.log  
./AnotherIO_20240405-162001.321012.log  
./SomeIO_20240405-162001.321012.log  

batch]$  find . -maxdepth 1 -type f 
./Spec.20240407-050801.log  
./Spec.20240407-052001.log
./Emp.20240407-050501.log
./Emp.20240407-053501.log
./grep.20240407-122.log

上記のように 似たような名前が多数あって、それぞれの共通部分でカウントしたい。*1

class]$ find . -maxdepth 1 -type f | sed -r 's/^\.\/(.*)_[0-9]{8}\-[0-9]{6}\.[0-9]{6}\.log$/\1/' | sort | uniq -c
batch]$ find . -maxdepth 1 -type f | sed -r 's/^\.\/(.*)\.[0-9]{8}\-[0-9]{6}|[0-9]{3}\.log$/\1/' | sort | uniq -c
日付毎ディレクトリを削除(年ごとに数えたり、特定フォーマットだけ削除したり)

まずYYMMDDのフォルダ名を年ごとに数えた。以下全て同じ結果(ディレクトリは上記ファイルと違って、短く書ける)。

find . -maxdepth 1 -type d -print | cut -c 3-6 | sort | uniq -c
find . -maxdepth 1 -type d | cut -c 3-6 | sort | uniq -c
ls -d */ | cut -c 1-4 | sort | uniq -c

あとは、次のように、いくらかのパターンで減らした。(以下前半は隔年で削除(後ろに特別に文字を入れたディレクトリ名は残す)。後半は、毎月30&31日を保管してたが一方を削除)

$ rm 2016???? -rf
$ rm 2018???? -rf
$ rm 2020???? -rf
$ rm 2022???? -rf

$ ls 2023??31 -d
20230131  20230331  20230531  20230731  20230831  20231031  20231231
$ ls 2023??30 -d
20230130  20230330  20230430  20230530  20230630  20230730  20230830  20230930  20231030  20231130  20231230
$ rm 2023??30 -rf

*1:考えてみれば、大した目的ではなかった。日付別のログディレクトリに移動する処理が効いていない日を、一つのログの種類で見つけようとしたところだった。ファイル数が多すぎるので普通にすべて表示しまっても訳分からなくなるから。しかし、日付部分を削除するのではなく、日付部分だけを取得して数えるほうが良かった。