私のシステム:
- オペレーティングシステム:MacOS / Mac OS X(Mojave 10.14.5)
- オペレーティングシステムコア:Darwin(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)-リリース(x86_64-apple-darwin18.5.0)
- zsh: zsh 5.7.1 (x86_64-apple-darwin18.2.0)
ls
MacOSでは、bashやzshなどのシェルを使用するターミナルCLIで(BSD)コマンド(または同様の一般的で便利なツール)を使用して、現在の作業ディレクトリではなくディレクトリの内容を一覧表示しようとしています~
。チルダ()で終わるファイルを除くファイル。
最後の規則を除いて、ls
これは現在ではないディレクトリが次の引数として使用されるときに自然に実行される可能性がありますls
。ls arg
ここでは、arg
現在ではないディレクトリへの絶対パスまたは相対パス(たとえば、、/absolute/path/to/directory
または~/path/from/home/to/directory
)path/from/current/dir/to/directory
。
-d
ls -d *[^~]
私はファイル名拡張子(「globbing」とも呼ばれます)と、次のオプション(コンテンツの代わりにディレクトリを一覧表示)を使用して、現在のディレクトリのバックアップではないコンテンツを一覧表示する方法を知っています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
?
答え1
ls
サブシェルで実行できます。
(cd arg; ls -d *[^~])
答え2
macOSだけでなくシェル変数もbash
使用してください。GLOBIGNORE
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
分離されたパターンのリストが:
原因でファイル名の完成はこれらのパターンを無視します。
macOSのユーティリティはbasename
複数のパス名を受け入れ、-a
オプションを使用すると、そのパス名のファイル名部分のみを含むリストを返します。
代わりにパターンを使用できますGLOBIGNORE
(特定のファイル名パターン拡張子を無視するより一般的な方法を提供します)*[!~]
(正規表現の種類の文字を否定しながら!
シェルの文字クラスを否定することに注意してください)。^
unset GLOBIGNORE
basename -a dir/*[!~]
...またはHomebrewからGNU coreutilsをインストールし、gls -B
Linuxシステムでおなじみの方法で使用することができます。
答え3
きちんとした答えは、サブシェルを使用して現在ではないディレクトリからコマンドを実行することです。
(cd arg; ls -d *[^~])
ただし、現在のディレクトリだけでなく、現在ではないディレクトリでも機能する一般的な機能を作成するには、次を.bashrc
(またはbashrc_aliases_lsBSD
、from .bashrc
)に追加できます。
alias ls='/bin/ls'
alias l=''
unalias l
function l () { ( if [[ -n "$@" ]]; then cd "$@"; fi ; /bin/ls -d *[^~] ) }
ls
上記のBSD使用の好みに反する場合は、GNUコアユーティリティをインストールして(たとえばを通じて)(上記のコードを使用する代わりに)(またはソースから)必要なエイリアスを生成することでこれを回避できます。問題のないGNU:brew install coreutils
.bashrc
bashrc_aliases_lsGNU
.bashrc
alias ls='/usr/local/bin/gls'
alias l='/usr/local/bin/gls -B'
私の現在の解決策は、両方の構造を使用し、必要に応じて私が呼び出す変数とLS_TYPE
私が呼び出す関数ls-switch
(bashrc_aliases
、 source: で定義されている.bashrc
)を使用して、両方の設定ファイルのうちの1つを取得する構造を切り替えることです。
function ls-switch () {
if [[ $LS_TYPE = "GNU" ]] ; then
LS_TYPE="BSD"
source ~/.config/bash/bashrc_aliases_lsBSD
elif [[ $LS_TYPE = "BSD" ]] ; then
LS_TYPE="GNU"
source ~/.config/bash/bashrc_aliases_lsGNU
fi
}
ls
この配列を使用すると、最初にインポートするプロファイルを定義して選択し、およびのデフォルト動作がl
設定されます。例:.bashrc
LS_TYPE
LS_TYPE="BSD"
source ~/.config/bash/bashrc_aliases_lsBSD