簡化路徑

路徑太長,想要縮短到 80 個字元以內,又要可以辨識,唯一找到的工具是 https://github.com/chrissound/SodiumSierraStrawberry

但這工具執行起來有問題,想要重新編譯,對 haskell 又不熟,只好放棄。

好在找到這篇:Path shortener for GUI application ,裏面提到可以用 Python3 的 pathlib 來做,於是就順手改了一下,做出自己要的工具

#!/usr/bin/env python3

import argparse
import sys
import pathlib

def cut_path(path, limit):
    if len(path)>limit:
      parts = list(pathlib.PurePath(path).parts)
      # print(parts)
      #if len(parts) >= 4:
      #    parts [2:-1] = ['...']
      new_parts = []
      for part in parts[:-1]:
        if len(part)>4:
          new_parts.append(part[:4] + "..")
        else:
          new_parts.append(part)
      new_parts.append(parts[-1])
      #print(new_parts)
      new_path = str(pathlib.PurePath(*new_parts))
      #print(len(new_path))
      if len(new_path) > limit:
        parts[2:-1] = ['...']
        return pathlib.PurePath(*parts)
      return new_path
    else:
      return path


def main():
    parser = argparse.ArgumentParser(
      prog=sys.argv[0],
    )
    parser.add_argument('-l', '--limit', type=int, default=76)
    parser.add_argument('filename')

    args = parser.parse_args()

    print(cut_path(args.filename, args.limit))


if __name__ == "__main__":
    main() 

基本運作是這樣

  1. 超過指定字元數目就做縮減,沒超過就直接回傳。
  2. 縮減的作法:使用 Pathlib 的 PurePath.parts() 把路徑拆成一段一段的,然後用名稱去做判斷,超過 4 個字元就把後面的改為 “…” ,然後產出新的字串。
  3. 若 2 的字串還是超過指定字元數目,就直接把其中一部份都刪除掉,改為 “…”

結果大約會是這樣

/home/user1/aaa.txt
coll../ansi../gov/twgc../role../veri../task../main.yml
collection/ansible_collections/.../main.yml

能夠這樣用 Python3 快速的弄出個小工具,真的是蠻開心的,Python3 真的自帶很多好東西可用。