web-dev-qa-db-ja.com

lsコマンドからの出力の1列だけをエコーするにはどうすればよいですか?

Lsコマンドを実行すると、出力は次のようになります。

file1 file2 file3 file4

出力の特定の列のみ、この場合はfile2を表示することは可能ですか?私は成功せずに以下を試しました:

echo ls | $2

基本的に私がやりたいのは、2番目の列だけをエコーすることです。この場合は、エコーしたいです。

file2
61
John

次のコマンドは、ls出力を1つの列にフォーマットします

ls -1 /directory
87
ch0ps

あなたはこれを探しています:

ls -C | awk '{ print $2 }'

ただし、後でこのファイル名を使用することを想定している場合は、空白を含むファイル名で破損するため、これを行わないでください。代わりに、ファイルを配列に入れて2番目のファイルを取得します。これにより、解析をまったく行う必要がなくなります。

files=(*)
printf '%s\n' "${files[1]}"

ファイルを取得する順序は、LC_COLLATEの値によって異なります。そのため、すべての特殊なケースで「標準」の並べ替えが必要な場合は、LC_COLLATE=Cを最初に設定することをお勧めします。

40
Chris Down

出力が端末でない場合、lsは単一列モードを使用するため、-Cを追加する必要があります。 awkは、2番目の列を出力します。

ls -C | awk '{print $2}'
7
tkrennwa

あなたが探していると思います

ls -1

権限、所有者、グループ、日付、サイズは表示されませんが、単一の列に単純なファイル名が表示されます。

3
Niti

すでに述べたように、lsはファイル名の長さと端末の幅に応じて行を分割するため、ls出力の解析に列を使用することはあまり堅牢ではありません。要素のリストの単一の列を表示することは、多くの場合興味深いものです。これを行うには、cutコマンドを使用します。

echo file1 file2 file3 file4 | cut -d" "  -f2

表示されます

file2

ご了承ください -dを使用すると、列区切り文字を選択できます。たとえば、

cut -d, -f2

コンマ区切りリストの2列目を表示できます。

1
A Roebel

私にとって唯一の方法は、「-all」を追加することです。あれは:

ls -C -all | awk '{ print $1 }'

-allユーザー、権限などの列を追加します。

現在のパスの下にある特定のファイル名のみを表示したい場合は、以下のコマンドを使用してください

コマンド:

find path -maxdepth 1 -iname "filename"|sed "s/\.\///g"
0

ls -Cの解析は以下に依存するため、これは注意が必要です。

  1. ファイル名の長さ(これ自体はls -Cに渡される指定されたファイルリストに依存します)
  2. 端子幅。
  3. ls -Cの出力は列形式ですが、フィールドセパレーターとしてさまざまな数のスペースに設定できる場合があります。
  4. ファイル名に空白が含まれている可能性(その表示は、選択した特定のls表示オプションによって異なります)。

とりあえず、より簡単な問題から始めましょう(ie上記の#4ではありません)、想定ファイル名に空白はありません。列#2を印刷するには、次のようにします。

COLUMNS=$COLUMNS ls -C | tr -s ' ' '\t' | cut -f2

展開:

  • COLUMNS=$COLUMNSは、|に供給される列の長さが現在の端末の表示と一致することを保証します。これを任意の値に変更することもできます。そのため、COLUMNS=50またはCOLUMNS=70は、ls -Cがそれらの幅に従って物事を再配置するようにします。

    別の方法は、-wスイッチを使用することです。例:

    ls -w${COLUMNS} -C | tr -s ' ' '\t' | cut -f2
    
  • trは、フィールドセパレータを一貫させます。各列の間に1つのtabを付けます。

  • cutは、目的の列を出力します。

0
agc