MacでBSDコマンドlsを使用してバックアップファイル(〜で終わる)を表示せずに現在ではないディレクトリの内容を一覧表示するにはどうすればよいですか?

MacでBSDコマンドlsを使用してバックアップファイル(〜で終わる)を表示せずに現在ではないディレクトリの内容を一覧表示するにはどうすればよいですか?

私のシステム:

  • オペレーティングシステム: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 lsBSD共通コマンドマニュアルのページを提供します。
  • シェル:
    • Bash: GNU bash、バージョン 5.0.7(1)-リリース(x86_64-apple-darwin18.5.0)
    • zsh: zsh 5.7.1 (x86_64-apple-darwin18.2.0)

lsMacOSでは、bashやzshなどのシェルを使用するターミナルCLIで(BSD)コマンド(または同様の一般的で便利なツール)を使用して、現在の作業ディレクトリではなくディレクトリの内容を一覧表示しようとしています~。チルダ()で終わるファイルを除くファイル。

最後の規則を除いて、lsこれは現在ではないディレクトリが次の引数として使用されるときに自然に実行される可能性がありますlsls argここでは、arg現在ではないディレクトリへの絶対パスまたは相対パス(たとえば、、/absolute/path/to/directoryまたは~/path/from/home/to/directorypath/from/current/dir/to/directory

-dls -d *[^~]私はファイル名拡張子(「globbing」とも呼ばれます)と、次のオプション(コンテンツの代わりにディレクトリを一覧表示)を使用して、現在のディレクトリのバックアップではないコンテンツを一覧表示する方法を知っていますls -d *[!~]。同じタイプの結果が必要ですが、現在のディレクトリではありません。

ls -d arg/*[^~]上記と同じですargが、結果には各コンテンツ要素(つまり、関心のあるディレクトリ内のすべてのファイルとディレクトリ)へのパスが表示されます。lsを使用しているかのように、パスを表示せずに各要素を表示したいと思いますls arg

Linuxでは、GNUコマンドを使用してlsバックアップファイルを一覧表示しないオプションを使用して必要なものを取得できます。これが私が望むものですが、これを達成するためにMacOSの基本ツール(BSDを好む)を使用したいと思います。-Bls -B argls

注:出力の形式と色が変わるためgrep(例ls arg | grep '.*[^~]$':)を使用したくありません。grep

質問のレビュー:Macで現在ではないディレクトリの内容を一覧表示しますが、バックアップファイルは表示されない方法を使用するのが最善ですかls

答え1

lsサブシェルで実行できます。

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

答え2

macOSだけでなくシェル変数もbash使用してください。GLOBIGNOREbasename

$ 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 -BLinuxシステムでおなじみの方法で使用することができます。

答え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.bashrcbashrc_aliases_lsGNU.bashrc

alias ls='/usr/local/bin/gls'
alias l='/usr/local/bin/gls -B'

私の現在の解決策は、両方の構造を使用し、必要に応じて私が呼び出す変数とLS_TYPE私が呼び出す関数ls-switchbashrc_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設定されます。例:.bashrcLS_TYPE

LS_TYPE="BSD"
source ~/.config/bash/bashrc_aliases_lsBSD

関連情報