スペースを含むファイル/ディレクトリに関する情報のリスト

スペースを含むファイル/ディレクトリに関する情報のリスト

ファイルとディレクトリに関する情報を取得するために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

関連情報