Command-Line

在 Mac 上,如何在不顯示備份文件(以 ~ 結尾)的情況下列出非目前目錄的內容,最好使用 BSD 命令 ls?

  • June 5, 2019

我的系統:

  • 作業系統:MacOS / Mac OS X (Mojave 10.14.5)

  • 作業系統核心:達爾文(18.6.0)

  • 核心:達爾文核心 / XNU (18.6.0 / xnu-4903.261.4~2/RELEASE_X86_64)

  • ls:版本未知,但man ls提供了 BSD 通用命令手冊中的頁面

  • 貝殼:

    • Bash:GNU bash,版本 5.0.7(1)-release (x86_64-apple-darwin18.5.0)
    • Zsh:zsh 5.7.1 (x86_64-apple-darwin18.2.0)

在 MacOS 中,在使用 bash 或 zsh 等 shell 的終端 CLI 中,我想使用(BSD)命令ls(或者可能是類似的常見且有用的工具)來列出目前工作目錄以外的目錄的內容,其中顯示除以波浪號 ( ) 結尾的所有文件~

排除最後一條規定,ls當非目前目錄用作參數時,自然會完成這個任務lsls argwherearg是非目前目錄的絕對或相對路徑(例如/absolute/path/to/directory~/path/from/home/to/directorypath/from/current/dir/to/directory)。

-d我知道如何使用文件名擴展(又名“globbing”)和選項(列出目錄而不是它們的內容)列出目前目錄中的非備份內容,如下所示:(ls -d *[^~]ls -d *[!~])。我想要相同類型的結果,但對於非目前目錄。

我幾乎可以通過使用 來實現我想要的ls -d arg/*[^~],其中arg與上面描述的相同,但是結果顯示了每個內容元素的路徑(即,感興趣的目錄中的每個文件和目錄)。我想ls顯示沒有路徑的每個元素,就像用ls arg.

在 Linux 中,使用 GNU 命令,我可以使用不列出備份文件ls的選項來實現我想要的: . 雖然這是我想要的,但我想使用 MacOS 原生的工具來實現這一點,最好是 BSD 。-B``ls -B arg``ls

注意:我不想使用grep(例如,ls arg | grep '.*[^~]$'),因為grep會更改輸出的格式和顏色。

問題回顧:在 Mac 上,如何列出非目前目錄的內容,但不列出備份文件,最好使用ls?

您可以ls在子shell中執行:

(cd arg; ls -d *[^~])

使用bash及其GLOBIGNOREshell 變數,以及 macOS 的basename

$ mkdir dir
$ touch dir/file{1,2}{,~}
$ ls -R
dir

./dir:
file1   file1~  file2   file2~
$ GLOBIGNORE=*~
$ ls -d dir/*
dir/file1       dir/file2
$ basename -a dir/*
file1
file2

設置GLOBIGNORE:-delimited 模式列表將使文件名完成忽略這些模式。

如果您使用它的選項,macOS 中的basename實用程序接受多個路徑名-a,並將返回一個僅包含這些路徑名的文件名部分的列表。

而不是使用GLOBIGNORE(它提供了一種更通用的方法來忽略某些文件名模式擴展),您顯然可以使用您的模式*[!~](請注意,!否定 shell 中的字元類,同時^否定正則表達式中的字元類):

unset GLOBIGNORE
basename -a dir/*[!~]

… 或者,您可以從 Homebrew 安裝 GNU coreutils 並gls -B按照您在 Linux 系統上的習慣使用。

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