私はUnixに初めて触れ、助けが必要です。ls -l
コマンドを実行して(実際にls -alR
は)出力をファイルにパイプすると、返されたlsフィールドを区切るためにスペースが使用されます。本質的に私が達成したいのは、lsフィールドをタブまたはパイプ文字(両方とも機能する必要がある)で区切ることです。コマンドを表示してpr
スペースをタブに置き換え始めましたが、ls出力にスペースの数が異なるため、機能しませんでした。これにより、このファイルをインポートするときにエラーフィールドが発生しました。
答え1
後でこの出力を分析したい場合はブロックします。バラよりこのページ理由をよりよく説明するために。とにかく、必要な情報を取得するのは非常に難しいですls
。特にファイル名にスペースやその他の特殊文字が含まれている場合は特にそうです。 csvなどをビルドする場合は、より良いオプションは次の-printf
オプションを使用することですfind.
。このコマンドを使用すると起動します。
find . -printf "%M|%n|%u|%s|%P\n" > output
これはコマンドと同じようにスタートアップディレクトリで繰り返されますls
。パイプで区切られたフィールドを持つファイルに、権限、リンク数、所有者、グループ、サイズ、およびファイル名をダンプします。詳しくはマニュアルページをご覧くださいfind
。
答え2
何の努力もせずにlsを解析できます。シミュレーション ls -l
stat
目的の形式でGNU coreutilsコマンドを使用してください。 bashシェルでglobstarオプションを使用してファイルを再帰的にリストし、dotglobオプションを使用してドットファイルをリストすると、かなり合理的な結果が得られます。ファイルの変更時には、%Y
「epoch以降の秒」を使用することを選択しました。必要に応じてフォーマットを再指定する%y
ために%Y値を使用または渡すこともできます。date
エポック以降の秒数を使用することは、ダウンストリームプロセッサに必要に応じてそれを表示させる非常に柔軟な方法です。
単純なファイルの場合:
$ stat -c "%A|%h|%U|%G|%s|%Y|%n" hosts.txt
-rw-r--r--|1|username|pgrp|135387|1202230643|hosts.txt
模倣するls -alR
:
$ shopt -s globstar dotglob
$ stat -c "%A|%h|%U|%G|%s|%Y|%n" **
drwxr-xr-x|2|username|pgrp|4096|1510073497|.dotdir
-rw-r--r--|1|username|pgrp|0|1510073497|.dotdir/.dotfile
-rw-r--r--|1|username|pgrp|0|1507213776|f/test case
-rw-r--r--|1|username|pgrp|0|1507213776|f/test case.csv
-rw-r--r--|1|username|pgrp|135387|1202230643|hosts.txt
drwxr-xr-x|2|username|pgrp|4096|1510073307|space dir
-rw-r--r--|1|username|pgrp|0|1510073307|space dir/space file
-rwxr-xr-x|1|username|pgrp|112|1510073163|stat.sh
これは移植性が低下する可能性がありますが(coreutils / statを持たないシステムの場合)、関心のあるフィールドのみを印刷できる柔軟性を持ち、ファイル名のスペースを変更するリスクはありません。
答え3
以下を追加するだけです。
ls -alR | sed -r s'/\s+/|/g'
これは、出力を変更したいすべてのコマンドに適用されます。 \s は「空白」を表し、「+」は 1 つ以上の項目(タブ文字と一致する)を表し、「|」は必要に応じていくつかの記号があることを覚えておいてください。タブ文字を使用するには、次のように「\」を使用して特殊文字をエスケープする必要があります。
ls -alR | sed -r s'/\s+/\t/g'