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


54

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

file1 file2 file3 file4

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

echo ls | $2

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

file2

2
出力のが本当に必要な状況は何lsですか?
michas

11
原則として、lsを解析しないでください。ほとんどがあり、常にあなたが必要な情報を得るためのより良い方法は。
テルドン

私は見知らぬ人にしないだろう:P(残念私のオールウェイズは、そのフレーズを気に入っ)列の数は、ファイルとフォルダを持っている名前に依存するので、第二の列が希望の1、またはない場合もあり得るか、または1であってもよいlsし、いくつかのファイル/フォルダを作成した後、それはもはやあなたが望むものではないかもしれません。テルドンが指摘したように、あなたが欲しいものを手に入れるより良い方法があることを確認してください
YoMismo

回答:


82

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

ls -1 /directory

2
しかし、OPが関心を持っているのは1つの列だけではありません
。-アントン

1
それを修正するには:ls -1 /directory | head -2 | tail -1またはls -1 /directory | perl -ne 'print if $. == 2'
KWubbufetowicz

@KWubbufetowicz ls | sed -n '1p;q'はシンプルに見える
Fiximan

3
私が探していた答えですが、OPの質問ではありません。
マイケルラング

36

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

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

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

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

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


配列インデックスは1、賢明なシェル(zsh、yash、fish、csh、tcsh、rc、es ...)で始まり、0kshとbashで始まることに注意してください。すべてのBourneのようなシェルに移植可能なソリューションの場合は、set -- *; printf '%s\n' "$2"代わりに次を使用できます。
ステファンシャゼラス

@StéphaneChazelas少なくともこの質問では、タグに「bash」が含まれているため、この回答はそのシェルに固有のものです。
クリスダウン

ls -C | awk '{print $ 1}は同じ出力になります...なぜ$ 2ですか?
boctulus

7

出力が端末でない場合は、単一列モード-Cls使用するように追加する必要があります。 awk次に、2番目の列を印刷します。

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

2

あなたが探していると思う

ls -1

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


1
この答えが間違っているだけでなく、以前に与えられています。
スコット

これは元の質問には間違っていると思いますが、それは私が探していたものです。よろしくお願いします。
AntumDeluge


0

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

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

表示されます

file2

-dこれで例えば、あなたが列区切り文字を選択することができます

cur -d, -f2

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


0

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

コマンド:

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

0

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

  1. ファイル名の長さ(それ自体はに渡される指定されたファイルリストに依存しますls -C
  2. 端子幅。
  3. 事実ls -C出力が柱状であるが、フィールドの区切りとしてスペースの数を変えるように構成することがあります。
  4. ファイル名に空白が含まれる可能性(表示はls選択した特定の表示オプションに依存します)。

今のところ、(、のが簡単な問題から始めましょうすなわち、ない#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フィールドセパレータを一貫させます:各列間の単一タブ

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


ホワイトスペースメソッド保留...
agc

-1
num_chars=54 # offset
ls -ltr | cut -c$num_chars-

必要に応じて文字数(54)を変更して、必要なデータのみを取得します。


2
明確にするために、54-位置54から始まるすべての文字にtellカットを使用します。「人間が認識した」列に
留まらない

悪い考えではありません。洗練する必要があります。
prusswan
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.