回答:
試してくださいls -l | awk '{print $7}'
。
awk
このタスクに最適なように列を選択します。
ls -l --block-size=M
ですか?
ls
コマンドはPOSIX標準ではないため、依存するスクリプトls
は異なるシステムで、または時間が経つと壊れる可能性があります。詳細については、このページの@ormaajによる回答を参照してください。求めることを行う1つの方法は、Bashループを使用することです。以下に例を示します。for FILENAME in *; do FILESIZE=$(( $( stat --format=%s "${FILENAME}" ) / 1024 )); echo "${FILENAME}" ${FILESIZE}; done
。もちろん、ではなくecho
、処理を使用します。
... | xargs -d '\n' du -m
同様に動作するfindコマンドの出力をパイプでつないでしまいました。
-exec
オプションをご覧くださいfind
。
lsを解析しないでください。GNUを使用しますfind
。または、移植性が重要でない場合は、stat(1)
。
find . -maxdepth 1 -printf '%Td\n'
ファイル名のリスト以外のデータを1行ずつ読み取り、フィールドに分割する方法については、BashFAQ / 001を参照してください
ほとんどの状況で意味をなすファイル名の改行区切りリストを確実に読み取る方法はありません。
次のようにシェルで特定の列をフェッチできます。
ls -al | while read perm bsize user group size month day time file; do echo $day; done
またはawk
に示すように@Coreyの答え、cut -c44-45
また、調整後の作業(以降しまうls
の列を固定している)、または任意の他は、しかし、主な問題はそれが信頼性が高く、防弾ではないだろうということである(例えばUnix上で、それはかもしれ$6
、ない$7
、それ引数に応じて変化します)マシンフレンドリーではないls
ため、コマンドを解析することはまったくお勧めできません。
最適なのは、必要な出力をフォーマットするための関連オプションを提供できる、find
またはなどの使用可能なさまざまなコマンドを使用するstat
ことです。例えば:
$ stat -c "%x %n" *
2016-04-10 04:53:07.000000000 +0100 001.txt
2016-04-10 05:08:42.000000000 +0100 7c1c.txt
数日間の変更の列を返すには、次の例を試してください。
stat -c "%x" * | while read ymd; do date --date="$ymd" "+%d"; done
GNU stat
がBSD stat
に対して異なるオプションを持っている可能性があることに注意する価値があります。
stat
。date
ただし、セットアップが正しくありません。あなたは追加する必要があります--date=$ymd
から、date
それ自体で現在の日に印刷されますが、ここでの目的は、ファイルの日付フォーマットを変換することです
ls -la | cut -c32-33
コマンドは、ファイル名に潜在的な落とし穴があるだけでなく、単にユーザー名の長さとファイルのサイズに依存しているため、完全に信頼できません。このstat -c "%x" *.*
コマンドは問題ないように見え*.*
ますが、使用することにより、ドットを含むファイル名のみに制限しています。意図は隠しファイルもキャッチすることだったと思います。その場合は、事前にドットファイルのグロビングを有効*
にし、*.*
次の代わりに使用する必要がありますshopt -s dotglob; stat -c "%x" * | [...]
。
--date="$ymd"
に、date
コマンドに追加する必要があります。追加しないと、現在の日付が表示されます。
ls
。このfind
コマンドは非常に役立ちます。