ファイルとディレクトリに関する情報を取得するためにlsを使用しようとしています。ファイル/ディレクトリに空白があるたびに、現在のコマンドが名前を正しく取得できません。
これは、ディレクトリ内のすべてのファイル/ディレクトリを一覧表示するために使用します。
ls -al --time-style=+%s . | awk '{if ($7 != ".." && $7 != "." && $1 != "total") print $1"\t"$3"\t"$5"\t"$6"\t"$7}'
私のパスワードに「no-spaces-dir」、「some dir」、「some other dir」の3つのディレクトリがあると仮定すると、次のような結果が出力されます。
drwxr-xr-x. testuser 4096 1349853378 no-space-dir
drwxr-xr-x. testuser 4096 1349853387 some
drwxr-xr-x. testuser 4096 1349853359 two
私のawk部分に問題があると言いたいです。それから7ドルしなければならない明らかに $8 と $9 を追加することで、私が設定した例に対して必要な出力を得ることができますが、ディレクトリに空白が 1~2 つしかないことは必ずしもわかりません。
他の情報(ファイル/ディレクトリ権限、ユーザー、スペース、タイムスタンプ)を保存し、コマンド出力からフルネームを取得するにはどうすればよいですか?
答え1
問題は、awkがスペースをフィールド区切り文字として使用して入力を解析することです。フィールドにスペースが含まれると、問題が発生する可能性があります。
ls
"dotglob" bashシェルオプションを使用して、解析された出力のstat(1)
代わりに必要なものを取得できます。
shopt -s dotglob # Enable * to match files starting with a dot
stat -c $'%A\t%U\t%s\t%Y\t%n' *
書式文字列は、目的の書式で目的のフィールドを出力します。 $ '...'を使用すると、\ tをタブに展開できます。必要に応じて、実際のタブ文字を挿入して先行$を削除できます。
dotglobの詳細については、bash(1)
マニュアルページを読んでGLOBIGNOREに従ってください。stat(1)
フォーマット文字列に何を入れることができるかについては、マニュアルページを読んでください。
答え2
すでに述べたように、解析はls
ディレクトリの内容を印刷する最良の方法ではありません。しかし、問題は簡単に解決されます。
ファイル/ディレクトリ名は常に最後の列(または複数の列)なので、$ 7を印刷する代わりに$ 7から最後の列まで印刷できます。次の方法でこれを実行できます。
substr($0, index($0, $7))
したがって、完全なコマンドは次のようになります。
ls -al --time-style=+%s . | awk '{if ($7 != ".." && $7 != "." && $1 != "total") print $1"\t"$3"\t"$5"\t"$6"\t" substr($0,index($0,$7));}'
また、ローカライズされたシステム(おそらく言えば)$1 != "total"
では機能しないため、確認するのは良い考えではありません。十分な熱があることを確認するためにtotal
使用することをお勧めします。NF>6