Shell

以與 Finder 中相同的順序在終端中獲取文件列表

  • September 11, 2022

我有一個包含大約 1,000 個圖像文件的文件夾。我需要創建他們的列表。我在某處看到,如果我進入終端並 cd 進入文件夾,我所要做的就是輸入

ls > list.csv

生成一個列表。問題是,這個列表與我在 Finder 中看到的文件的順序不同。例如,在 Finder 中,第一張圖片是 16_left.jpg。但是,生成的 list.csv 文件中的第一個圖像是 10017_left.jpg,而 16_left.jpg 一直依偎在 15975_right.jpg 和 16007_right.jpg 之間。

我可以在 Finder 中看到,它將數字 16 視為文件中最小的數字並將其放在頂部,而 list.csv 文件不是按整數本身而是按從左到右的每個單獨數字對列表進行排序。

如何讓 list.csv 與 Finder 的順序相同?

ls預設情況下,shell glob 會按名稱對文件列表進行詞法排序。

的 GNU 實現ls有一個版本-v排序選項,可以在這里為您提供幫助,但在 macos 中沒有等價物(它用於其他東西(逐字)。ls``-v

的 GNU 實現也sort有一個-V用於版本排序的選項。macossort確實複製了那個(BSDsort曾經是 GNU sort,所以重寫了他們的那些保留了 API)。

因此,如果目前工作目錄中的所有文件名都沒有換行符。

ls | sort -V

會給你一個數字順序。

在 zsh shell 中,該numericglobsort選項(使用 啟用set -o numericglobsort)可用於預設對 glob 擴展進行數字排序,或者您可以使用nglob 限定符在每個 glob 的基礎上選擇該順序:

print -rC1 -- *.jpg(Nn)

(這裡也使用Nullglob 限定符不抱怨,如果沒有匹配)會print raw on 1 Column 名稱以 結尾的非隱藏文件.jpg,按數字排序。

但是,要獲取 csv 格式的列表,您需要以下內容:

(){ print -rC1 -- \"${^argv//\"/\"\"}\"; } *.jpg(Nn)

也就是說,將文件名用引號括起來,並將文件名中的"s 轉義為"".

引用自:https://unix.stackexchange.com/questions/716914