列出目錄中的檔案(包括子資料夾的內容)並進行排序

列出目錄中的檔案(包括子資料夾的內容)並進行排序

我希望列出目錄的全部內容,包括子資料夾的內容,但按檔案大小排序。到目前為止,我已經成功地進行了列表和排序,同時仍然遞歸ls -lhSR(這h很好,但對我來說絕對不是必需的,只要我可以獲得文件大小)。我可能會忽略一些顯而易見的事情,或詢問不可能的事情,但這裡的任何建議將不勝感激。

答案1

您可以使用查找:

find . -type f -printf "%s %P\n" | sort -n

可選:要將位元組值轉換為人類可讀的格式,請新增以下內容:

| numfmt --to=iec-i --field=1

解釋:

 find in current directory (.) all files (-type f) 

 -printf: suppress normal output and print the following:
     %s - size in bytes
     %P - path to file
     \n - new line

 | sort -n: sort the result (-n = numeric)

答案2

由於您沒有指定特定的 shell,因此這裡有一個使用 zsh 的 glob 限定符的替代方案

setopt extendedglob

用於遞歸。那麼例如:

  1. 遞歸列出純文件:

    printf '%s\n' **/*(.)
    
  2. 遞歸列出純文件,訂購者壓痕L長度(即尺寸):

    printf '%s\n' **/*(.oL)
    
  3. 遞歸列出純文件,訂購者壓痕尺寸:

    printf '%s\n' **/*(.OL)
    
  4. 遞歸列出純文件,依大小遞減排序,然後選擇前 3 個結果:

    printf '%s\n' **/*(.OL[1,3])
    

如果您還想要檔案大小,那麼您可以使用

du -hb **/*(.OL[1,3])

答案3

設定 shell 選項後,globstar您可以使用 shell 通配:

shopt -s globstar         # don’t match hidden files
shopt -s globstar dotglob # match hidden files
stat -c"%s %n" **/* | sort -n

如果您嘗試使用太多文件,您將收到“參數列表太長”錯誤。要解決這個問題,您可以使用printfand xargs

printf "%s\0" **/* | xargs -0 stat -c"%s %n" | sort -n

我剛剛意識到這也列印了目錄(大小為 4096 位元組)——如果你不想這樣,可以使用這個:

stat -c"%A %s %n" **/* | sed '/^d/d;s/\S* //' | sort -n
printf "%s\0" **/* | xargs -0 stat -c"%A %s %n" | sed '/^d/d;s/\S* //' | sort -n

運行範例

$ tree
.
├── edits.png
├── makescript
├── new
│   └── edits.png
└── test
    └── 1.png

2 directories, 4 files
$ stat -c"%s %n" **/* | sort -n
0 test/1.png
43 makescript
2160 edits.png
2160 new/edits.png
4096 new
4096 test
$ stat -c"%A %s %n" **/* | sed '/^d/d;s/\S* //' | sort -n
0 test/1.png
43 makescript
2160 edits.png
2160 new/edits.png

答案4

用於快速互動使用在不太大的目錄樹上,shopt -s globstar真的很好。 glob 無法根據類型過濾目錄,但如果將其與ls -dthen一起使用,則ls只會列印目錄名稱,而不是內容。

假設您的ll別名包括-lh

  # with  shopt -s globstar   in your .bashrc
ll -rSd **/*

將為您提供這樣的輸出(來自我的 code-golf 目錄),但帶有顏色突出顯示(因此更容易查看目錄)。請注意,按檔案大小排序是跨子目錄進行的。

drwxr-xr-x 1 peter peter   70 Jun  8 07:56 casexchg
...
drwxr-xr-x 1 peter peter  342 Mar 13 18:47 parity-party
-rw-r--r-- 1 peter peter  387 Jul 29  2017 likely.cpp
-rw-r--r-- 1 peter peter  416 Aug 31  2017 true-binary.asm~
-rw-r--r-- 1 peter peter  447 Feb 23 20:14 weight-of-zero.asm
...
-rw-r--r-- 1 peter peter 6.4K Jun  1  2017 string-exponential.asm
-rwxr-xr-x 1 peter peter 6.7K Aug 31  2017 true-binary
-rwxr-xr-x 1 peter peter 6.8K Sep 17  2017 dizzy-integer
-rw-r--r-- 1 peter peter 7.5K Jul 24  2017 fibonacci/fibonacci-1G.v3-working-32b-stack-except-output.asm
-rw-r--r-- 1 peter peter 8.4K Jul 25  2017 fibonacci/perf.32bit-pop-114limb.sub-cmc.1G~
-rw-r--r-- 1 peter peter 8.4K Jul 25  2017 fibonacci/perf.32bit-pop-114limb.sub-cmc.1G
-rwxr-xr-x 1 peter peter 8.4K May 19 04:29 a.out
-rw-r--r-- 1 peter peter 8.9K Jul 25  2017 fibonacci/perf.python-xnor-2n
-rw-r--r-- 1 peter peter 9.5K Jul 26  2017 fibonacci/fibonacci-1G-performance.asm
-rwxr-xr-x 1 peter peter 9.6K Apr 12 23:25 empty-args
-rw-r--r-- 1 peter peter 9.7K Dec 18 17:00 bubblesort.asm
-rwxr-xr-x 1 peter peter 9.9K Feb  6 23:34 parity-party/a.out
-rw-r--r-- 1 peter peter 9.9K Jul 25  2017 fibonacci/fibonacci-1G-performance.asm~
...

您可以透過管道過濾掉目錄grep -v '^d'

如果您的檔案名稱具有模式,有時您可以使用僅符合檔案而不符合目錄的 glob。例如,或者如果您的目錄名稱中沒有任何一個以及您想要的所有文件,ll -rSd **/*.jpg甚至可以工作**/*.*.

(對於具有 DOS 背景的人來說:Unix 上沒有什麼神奇的*.*。它只是匹配任何包含文字點的目錄條目。但除了可執行檔案和有時是文字檔案之外,通常會為檔案名稱提供副檔名。 )

@dessert 指出你需要shopt -s dotglob它匹配全部文件。


與GNUfind

ls如果一個命令列中沒有太多文件,find -exec ls {} +會將它們全部放在命令列上,以便ls對它們進行排序。

find -not -type d -exec ls --color -lrSh {} +

使用-not -type d代替可以避免-type f忽略符號連結、命名管道、套接字、裝置檔案以及目錄中的任何其他內容。


du

du -ach | sort -h
....
4.0K    x86-modedetect-polyglot.o
8.0K    ascii-compress-base.asm
8.0K    dizzy-integer
8.0K    stopwatch-rdtsc.asm
8.0K    string-exponential.asm
8.0K    true-binary
12K     a.out
12K     bubblesort.asm
12K     casexchg
12K     empty-args
100K    parity-party
220K    fibonacci
628K    total

現在,目錄名稱已排序到清單中,並彙總其所有內容,但仍包含單一檔案。

sort -h,又名--human-numeric-sort,對帶有尺寸後綴的數字進行排序,例如du -hprints。它非常適合與du.

我經常使用du -sch * | sort -h, 或*/來僅獲取目錄。

du -sch **/* | sort -hdu如果您忘記有一個選項,將為您提供上述輸出-a

(我只是花時間查找它,因為我正在發布答案。對於互動式使用,我可能只會使用du -sch **/*.

相關內容