Lsコマンドを実行すると、出力は次のようになります。
file1 file2 file3 file4
出力の特定の列のみ、この場合はfile2を表示することは可能ですか?私は成功せずに以下を試しました:
echo ls | $2
基本的に私がやりたいのは、2番目の列だけをエコーすることです。この場合は、エコーしたいです。
file2
次のコマンドは、ls出力を1つの列にフォーマットします
ls -1 /directory
あなたはこれを探しています:
ls -C | awk '{ print $2 }'
ただし、後でこのファイル名を使用することを想定している場合は、空白を含むファイル名で破損するため、これを行わないでください。代わりに、ファイルを配列に入れて2番目のファイルを取得します。これにより、解析をまったく行う必要がなくなります。
files=(*)
printf '%s\n' "${files[1]}"
ファイルを取得する順序は、LC_COLLATE
の値によって異なります。そのため、すべての特殊なケースで「標準」の並べ替えが必要な場合は、LC_COLLATE=C
を最初に設定することをお勧めします。
出力が端末でない場合、ls
は単一列モードを使用するため、-C
を追加する必要があります。 awk
は、2番目の列を出力します。
ls -C | awk '{print $2}'
あなたが探していると思います
ls -1
権限、所有者、グループ、日付、サイズは表示されませんが、単一の列に単純なファイル名が表示されます。
すでに述べたように、ls
はファイル名の長さと端末の幅に応じて行を分割するため、ls
出力の解析に列を使用することはあまり堅牢ではありません。要素のリストの単一の列を表示することは、多くの場合興味深いものです。これを行うには、cutコマンドを使用します。
echo file1 file2 file3 file4 | cut -d" " -f2
表示されます
file2
ご了承ください -d
を使用すると、列区切り文字を選択できます。たとえば、
cut -d, -f2
コンマ区切りリストの2列目を表示できます。
私にとって唯一の方法は、「-all」を追加することです。あれは:
ls -C -all | awk '{ print $1 }'
-all
ユーザー、権限などの列を追加します。
現在のパスの下にある特定のファイル名のみを表示したい場合は、以下のコマンドを使用してください
コマンド:
find path -maxdepth 1 -iname "filename"|sed "s/\.\///g"
ls -C
の解析は以下に依存するため、これは注意が必要です。
ls -C
に渡される指定されたファイルリストに依存します)ls -C
の出力は列形式ですが、フィールドセパレーターとしてさまざまな数のスペースに設定できる場合があります。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
は、目的の列を出力します。