web-dev-qa-db-ja.com

ディレクトリ/ファイル名とサイズのみを表示するls

まず、これはこれの複製ではありません: Linux lsはファイル名の日付とサイズのみを表示します

追加で実際のディレクトリ名を印刷したいので。

私はいつもこのコマンドを使っていました:

ls -l | awk '{print $5, $9}'

各ファイルのサイズと名前を取得します。しかし、今、私はファイルディレクトリをさらに印刷する必要があります。

それは可能ですか?

5
Cyclone

つまり、現在のディレクトリを各ファイル名の先頭に追加するだけですか?

_ls -l | awk -v PWD=$PWD '{printf("%s %s/%s\n", $5, PWD, $9); }'
_

(_-v_は、_$PWD_シェル変数をawkスクリプトにインポートするだけです)。

または、他の何か?


OK、どうやらあなたが欲しいものは

_$ cd /some/path/to/somewhere
$ <insert command here>
somewhere/file1 size1
somewhere/file2 size2
...
_

thatは正しいですか?

その場合、必要な変更は次のとおりです。

_ls -l | awk -v PWD=$(basename $PWD) '{printf("%s/%s %s\n", PWD, $9, $5); }'
_

古いシェルを使用している場合、$()が機能しない可能性があります。

_ls -l | awk -v PWD=`basename $PWD` '{printf("%s/%s %s\n", PWD, $9, $5); }'
_

代わりに。 $()をサポートしていないシェルに直接アクセスすることはできませんが、_Illegal variable name_エラーが他のどこから発生するのかはわかりません。


それでもが機能しない場合は、プラットフォーム、シェル、awkのバージョンなどを質問で説明してください-コメントスレッドがかなり長くなり、推測が不足しています:-)

5
Useless

「ls出力を解析しない」という精神で、find?を使用しないのはなぜですか。

find . -maxdepth 1 -printf "%p\t%s\n"
2

ファイル名のディレクトリ部分をlsの出力に含める場合は、コマンドラインに含めます。

ls -l "$PWD" | awk '{print $5, $9}'

相対パスを印刷する場合は、適切なディレクトリからlsを呼び出して、必要な相対パスを印刷するように手配します。

dir=$(dirname "$PWD")
cd .. && ls -l -- "$dir" | …

lsの出力を解析する際の注意点 に注意してください。ユーザー名、グループ名、またはファイル名に空白が含まれている場合、そのスニペットは意味をなさないように出力します。

信頼性は高いが移植性のないカスタム形式でファイル属性を一覧表示する方法は stat です。

stat -f '%8z %R' -- *
stat -f '%8x %n' -- "$dir"/*

この出力を生成するためのより遅いがより柔軟な方法は、シェル内のファイルを反復処理することです。

for x in *; do
  printf '%8d %s\n' "$(wc -c <"$x")" "whatever/you/want/$x"
done

これは、 役に立たない が示唆している 上記 から借用したものです。

/bin/ls -l | awk -v CUR_DIR=$(basename $(pwd)) '{ if ($1 != "total") {printf("%s/%s %s\n", CUR_DIR, $8, $5);} }'

ただし、これは「合計xyz」行をフィルタリングします。 lsの出力は、ディストリビューションによって異なる場合があることに注意してください。鉱山は8番目の列にファイル名を示します(一方、無用は9番目の列としてそれを示します)。出力例を以下に示します。

ds/binary_search.py 1660
ds/growth.png 28262
ds/growth.py 1147
ds/heap.py 1277
ds/postfix.py 969
ds/prim.py 39
ds/queue.py 1188
ds/quicksort.py 2535
ds/QuickSortWeiss.class 2821
ds/QuickSortWeiss.Java 3500
ds/sin-cos.py 401
ds/sin-cos-two.png 28509
ds/sorting.py 4997

最後に、lsの正確な場所を提供すると役立つ場合があります。そうしないと、lsが別のエイリアスになっている場合、出力が再び異なる可能性があります。

更新:

上記のコマンドは、すべてのシステムで機能するようには見えません。理由はわかりません。しかし、これはうまくいくと思います。

/bin/ls -l | awk  '{ if ($1 != "total") {printf("%s/%s %s\n", $(basename $(pwd)), $8, $5);} }' | awk '{ print $8, $9 }'
0
Barun