web-dev-qa-db-ja.com

「dir」と「ls」端末コマンドの違いは?

私は、ターミナルでdirコマンドとlsコマンドを使用することの違いを見つけようとしました。 lsはディレクトリ内のファイルを表示する従来のUNIXの方法であり、dirはwindowsコマンドのPromptと同等ですが、両方のコマンドが端末で機能することは知っています。

dirと入力すると、ディレクトリ内のファイルとフォルダーが表示され、lsと入力すると、コンテンツの強調表示を除いて同じことが行われます。どちらのコマンドもオプションを受け入れます(つまり、ls -adir -aは両方とも、すべてのファイルとフォルダー、および隠しファイルを返します。

だから誰が違いが何であるか、そしてdirlsの両方が使用される理由を知っていますか?

74
BretD

dirlscoreutils の一部であり、dirlsとほとんど同じですが、異なるデフォルトオプションがあります。

GNUコアユーティリティは、GNUオペレーティングシステムの基本ファイル、シェル、およびテキスト操作ユーティリティです。これらは、すべてのオペレーティングシステムに存在することが期待されるコアユーティリティです。

info dirのコメント:

dirls -C -bと同等です。つまり、デフォルトでは、ファイルは列にリストされ、垂直にソートされ、特殊文字はバックスラッシュエスケープシーケンスで表されます。

ああ、vdirもあります! info vdirのコメント:

vdirls -l -bと同等です。つまり、デフォルトではファイルは長い形式でリストされ、特殊文字はバックスラッシュエスケープシーケンスで表されます。

おそらく、dirは、下位互換性のために、または歴史的な理由により存在します。

69
Rinzwind

lsdirの関係

lsおよびdirは、同様に動作する別個のプログラムです。以下で説明し、参照するように、dirの目的は、lsのようなコマンドを提供することです。そのコマンドの出力は、ターミナルに行くかどうかによって変化しません。これを有効に実現するために、dirは、端末での表示とファイルまたはパイプへの書き込みの両方に適切で便利な方法で出力をフォーマットする必要があります。

dirには2つの一般的な誤解があります。

  • dirlsのエイリアスであると多くの人が信じていますが、そうではありません。どちらのコマンドも他のコマンドのエイリアスではありません。Ubuntuでは、デフォルトでdirはエイリアスではありません。 lsおよびdirは、別個の同一でない実行可能ファイルによって提供されます。
  • 多くの人々は、dirが歴史的な理由がはっきりしないか、何らかの標準または他のOSとの互換性を提供するために存在すると考えています。それも事実ではありません。 lsは互換性のために動作します。dirは標準のUnixコマンドではないため互換性がなくても、開発者がその中で価値があると考える代替方法で動作します自分の権利であり、おそらく望ましい。

わかりましたが、lsdirはどう違うのですか?

lsdirは両方とも、ディレクトリの内容をリストします。デフォルトの動作における2つの特定の違いがそれらを区別します。

  1. 標準出力 が端末の場合、lsは、垂直にソートされた列にファイル名をリストします(ls -Cなど)。標準出力が端末ではない場合(たとえば、ファイルまたは pipe )、lsは1行に1つのファイル名をリストします(ls -1など)。

    標準出力が端末であるかどうかにかかわらず、dirは、垂直にソートされた列(ls -Cなど)にファイル名をリストします。

    lsdirの両方について、これらのデフォルトは、--format=フラグと、特定の-1フラグを短縮する-C-m-x、および--format=フラグによってオーバーライドされる場合があります。詳細については、 GNU coreutilsリファレンスマニュアル10.1.4一般的な出力フォーマット を参照してください。

  2. 標準出力が端末で、リストされるファイル名に 制御文字 が含まれる場合、lsは各制御文字の代わりに?を出力します(ls -qなど)。標準出力が端末でない場合、lsは制御文字をそのまま(ls --show-control-charsのように)出力します。

    標準出力が端末であるかどうかにかかわらず、dirがシェルに入力された場合に特別に解釈される制御文字またはその他の文字を検出すると、その文字のバックスラッシュシーケンスを出力します。これには、スペースなどの比較的一般的な文字も含まれます。たとえば、dirは、Documents backupsというエントリをDocuments\ backupsとしてリストします。これはls -bのようなものです。

    lsdirの両方について、これらのデフォルトは GNU coreutilsリファレンスマニュアル10.1.7ファイル名のフォーマット にリストされているフラグによって上書きされる場合があります。これには、-b-q--quoting-style=などが含まれます。

SourcesGNU coreutils reference manualls呼び出し および dir呼び出し .

dirがあるのはなぜですか?

個別のdirユーティリティの理論的根拠は、- GNUコーディング標準4.5インターフェースの標準 に記載されています。開発者の理由を理解するためにそのセクション全体を読むことをお勧めしますが、以下はls/dirに適用可能なハイライトです。

ユーティリティの動作を、その呼び出しに使用した名前に依存させないでください ....

代わりに、実行時オプションまたはコンパイルスイッチ、あるいはその両方を使用して、代替動作 .... から選択します。

同様に、コマンドラインプログラムの動作を出力デバイスのタイプに依存させないでください ....

互換性のためには、特定のプログラムが出力デバイスのタイプに依存する必要があります。 lsまたはshがすべてのユーザーが期待する方法でそうしなかった場合、悲惨なことになるでしょう。これらのケースのいくつかでは、出力デバイスのタイプに依存しない優先代替バージョンでプログラムを補完します。たとえば、デフォルトの出力形式が常に複数列形式であることを除いて、dirによく似たlsプログラムを提供します。

GNUプロジェクトは、技術的な観点から、ユーティリティが書き込み先のデバイスの種類に応じて異なる出力を生成することは望ましくないと考えています(少なくともユーティリティのデフォルト構成では)。 lsを含む一部のユーティリティでは、互換性のためにデバイス依存の出力が必要であるため、ユーザーの期待どおりに機能します。一部のユーザーは、このデバイス依存の動作を特に好んでいます。

lsはデバイスを独立して動作させるために合理的に記述できませんでしたが、これを実現するために別のdirユーティリティが作成されました。したがって、dirは、歴史的な互換性のために奇妙な動作をするユーティリティではありません。--ls is

lsdir、および関連するvdirユーティリティが、不要なコードの重複なしにcoreutilsソースコードにどのように実装されているかを確認するには、 ls-dir.cls-ls.cls-vdir.c を参照してください=、 ls.h 、および ls.c

dirは本当に便利ですか?

lsls | less)にパイプしたり、ファイル(ls > out.txt)にリダイレクトした場合でも、lessが複数列の出力を生成したい場合は、dirまたはls -Cを使用できます。

lsで示されるファイル名を直接コピーし、引用符を気にせずにコマンドの一部として使用したい場合dirまたはls -bを使用できます。

dirls -Cbと同等であるため、その意味でdirは必要ありません。ただし、dirは、実際にはしばしば有用なオプションの組み合わせを提供します(広く知られていません)。

なぜlsls -Cbでも)からカラー化された出力を得るのに、dirではないのですか?!

ほとんどのUbuntuユーザーは、ls --color=autoを実行するlsというエイリアスを持っています。 lsがエイリアスと外部コマンドの両方として存在する場合、シンプルな対話型コマンドではエイリアスが優先されます。

エイリアス定義は再帰的に展開されません。これは、lsエイリアスが--color=autoで呼び出す外部のlsコマンドです。エイリアスの機能の詳細については、 Bashリファレンスマニュアル6.6エイリアス を参照してください。

lsdir、またはvdir(およびgrepなどの他のコマンド)に渡されると、--color=autoは出力が端末の場合に色を使用しますが、そうでない場合は使用しません。

Ubuntuのデフォルトでは、ユーザーアカウントは~/.bashrcでこれで作成されます:

# enable color support of ls and also add handy aliases
if [ -x /usr/bin/dircolors ]; then
    test -r ~/.dircolors && eval "$(dircolors -b ~/.dircolors)" || eval "$(dircolors -b)"
    alias ls='ls --color=auto'
    #alias dir='dir --color=auto'
    #alias vdir='vdir --color=auto'

    alias grep='grep --color=auto'
    alias fgrep='fgrep --color=auto'
    alias egrep='egrep --color=auto'
fi

lsエイリアス(alias ls='ls --color=auto')はコメントが解除されていますが、dirvdirのエイリアスは#でコメントアウトされているため、効果がありません。つまり、dirはエイリアスではありませんが、ls is (ただしdirではなく)です。

dirも色付きの出力を生成するにはどうすればよいですか?

dirでカラー出力を有効にするには、ホームディレクトリで.bashrcを編集し、先頭の#alias dir='dir --color=auto'を削除して#行のコメントを解除します。変更後に開始されたシェルでは、dirがエイリアスになります。

現在のシェルで変更が必要な場合は、エイリアス定義をコマンドとして実行するか、.bashrcを実行して. ~/.bashrcを取得できます。

これはおそらく、dirの主要な点に反します。出力デバイスに関係なく、同じ種類の出力を生成する必要があるということです。しかしながら:

  • このdirエイリアスを作成すると便利な場合は、必ず使用してください。
  • スクリプトで、または\dirまたはcommand dirを実行してエイリアスをオーバーライドする場合など、外部コマンドとして呼び出された場合、dirはデバイスに依存しない出力を生成します。これは、dirdir --color=autoにエイリアスしても、実際にはdirを壊さないということです。
48
Eliah Kagan

dirはそこにあると思う傾向があります 後方互換性のため

GNU Coreutils から:

dirはls -C -bと同等です。つまり、デフォルトでは、ファイルは列にリストされ、垂直にソートされ、特殊文字はバックスラッシュエスケープシーケンスで表されます。

ところで、lsはデフォルトで出力を色付けしません:これは、ほとんどのディストリビューションがls --color=auto/etc/profile.dlsをエイリアスするためです。テストの場合、unalias lsと入力してからlsを試してください。無色になります。

出典: Renan 's answer to 「dir」と「ls」の違いは何ですか

5
Zlatan

疑わしい場合は、type lstype dirを比較してください( lsとlaの違い も参照)。

$ type dir
dir is aliased to `ls -l'

$ type ls
ls is aliased to `_ls'

$ type _ls
_ls is a function
_ls ()
{
    local IFS=' ';
    command ls $LS_OPTIONS ${1+"$@"}
}
$ echo command ls $LS_OPTIONS ${1+"$@"}
command ls -N --color=tty -T 0

違いはlsのさまざまなオプションに要約されます。私の場合は--color=ttyが最も見やすく、システムが異なる場合があります。

3
user2394284

短い答え:なし、dirは、デフォルトでlslsバイナリが--colorを持つソースコードと同じソースコードです。 (1行のコード差分)

2