Powershell 找早於15天的檔案

這個需求在 linux 用 find 寫,很方便

find /tmp/location -type f -mtime +15 -delete

在 Windows Powershell 的話,可以參考這篇 Delete files older than 15 days using PowerShell

$limit = (Get-Date).AddDays(-15)
$path = "C:\Some\Path"

# Delete files older than the $limit.
Get-ChildItem -Path $path -Force | Where-Object { !$_.PSIsContainer -and $_.CreationTime -lt $limit } | Remove-Item -Force

# Delete any empty directories left behind after deleting the old files.
Get-ChildItem -Path $path -Force | Where-Object { $_.PSIsContainer -and (Get-ChildItem -Path $_.FullName -Recurse -Force | Where-Object { !$_.PSIsContainer }) -eq $null } | Remove-Item -Force -Recurse

這是使用 Get-ChildItem -Path $path ,搭配 Where-Object ,Where-Object 裏面是做判斷, $_ 是每個項目,用每個項目的 CreationTime 去判斷,然後用 Remove-Item 去刪除。

找指定位置下的目錄

想找到指定位置下的目錄,但不要再深入。指定位置下的目錄是這樣的

/tmp/location
  +-- dir1
    + dir11
  +-- dir2
    + dir21
  foo.txt

我預期是只看到 dir1 跟 dir2,所以我用 find

find /tmp/location -type d -print

結果我找到的是

/tmp/location
/tmp/location/dir2
/tmp/location/dir2/dir21
/tmp/location/dir1
/tmp/location/dir1/dir11

find 的輸出跟我預期的不相符啊,我又不想用 ls 處理,後來找到 -maxdepth -mindepth 這兩個參數,搭配起來使用就可以了。

find /tmp/location -maxdepth 1 -mindepth 1 -type d -print

這樣就會是我需要的 dir1 跟 dir2

/tmp/location/dir2
/tmp/location/dir1

又學到一課,謝謝你 find

paps

之前使用 enscript 來將文字檔轉為 pdf,但實測發現,若文字檔裡面是中文,那麼轉出來是亂碼。

只好找其他的方案,找到的是 paps: https://github.com/dov/paps

paps 比較麻煩的是需要自己安裝,安裝說明可以參考:https://github.com/dov/paps/blob/master/INSTALL.md

我的環境是 Ubuntu 20.04

第一個是需要 meson,這個直接用 apt-get 安裝就可以

sudo apt install meson

第二個是 fmtlib ,Ubuntu 20.04 內的 fmtlib 版本過舊,這邊需要借助 backports

sudo add-apt-repository ppa:savoury1/backports
sudo apt install libfmt-dev

最後就是編譯

https://github.com/dov/paps.git
cd paps
meson build
cd build && ninja
sudo ninja install

這樣就可以得到 paps 了。

電影流水帳(2023/02/01~2023/02/28)

Ana de Armas - 042
Ana Celia de Armas Caso
  • Knives out (IMDB, Wikipedia),台譯:峰迴路轉。
  • Glass Onion: A Knives Out Mystery (IMDB, Wikipedia),台譯:峰迴路轉2-抽絲剝繭。

這兩部電影拍的都很有味道,邊看電影的同時,邊讓人享受推理的樂趣。

Knives out

這部電影的故事,印象中有看過,記得是跟陪死者的看護有關係,但我始終找不到之前在哪裡看過。

死者是富裕的小說家,家裡的女兒、兒子都有些狀況,父親不想留財產給他們。小說家在某天早上就被發現死了,這下就糟了,沒多久,所有家人都到齊,知名的偵探也來了。於是展開了調查,在偵探檢視了所有人的動機以及現場留下的線索以後,案情陷入撲朔迷離的狀態,但在偵探慢慢調查跟排除不可能的動機之後,終於找到凶手。

其實在整個過程下來,可以猜出來誰是凶手的,就是這種抽絲剝繭的魔力,讓人對推理小說愛不釋手。

Glass Onion: A Knives Out Mystery

這部電影的故事同樣跟富翁有關係。

這富翁當初在創業初期時,有把其中一個人以法律方式,趕出了團隊。在創業初期若沒有處理好股權的部份,很容易發生這種事情。之後這人一直想爭取回自己應有的權益,只是始終未果。

這富翁的個性有點偏差,愛炫燿,把謎題寄給之前一起的人,算是創業伙伴或投資伙伴吧,你得解開謎題,才會知道在什麼時間地點集合,才能到富翁的島上渡假。偵探受到某人的委託,幫忙解開了謎題,也一同跟著過去。

到了島上以後,跟前集一樣,看似融洽的關係,其實暗潮洶湧。果不其然,就有人死了,大家都很害怕,但臨時有暴風雨,無法離開島上,很多事情就開始爆出來。同樣,偵探這時取得大家同意以後,開始進行調查跟推理。

跟上集有點不同的地方是,這集偵探其實早在要到島上前,就已經知道有古怪,所以跟委託人講好怎麼調查,開始設局了。最終,當然有找到凶手,富翁的公司也受到事件的影響而下市。

簡化路徑

路徑太長,想要縮短到 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 真的自帶很多好東西可用。