在 Mac 上,如何在不顯示備份文件(以 ~ 結尾)的情況下列出非目前目錄的內容,最好使用 BSD 命令 ls?
我的系統:
作業系統: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
當非目前目錄用作參數時,自然會完成這個任務ls
:ls arg
wherearg
是非目前目錄的絕對或相對路徑(例如/absolute/path/to/directory
、~/path/from/home/to/directory
或path/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
及其GLOBIGNORE
shell 變數,以及 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 系統上的習慣使用。