ls -Rlh /path/to/directory > file
私はいくつかのハードドライブの内容を記録するためにいくつかのテキストファイルを使用してきました。
テキストファイルを作成した後、いくつかの文字列を削除したいと思います。
テキストファイルのいくつかの例は次のとおりです。
external1:
total 36K
drwxrwxr-x 2 emma emma 4.0K Oct 31 01:29 dir1
drwxrwxr-x 2 emma emma 12K Oct 31 01:29 dir2
drwxrwxr-x 2 emma emma 20K Oct 31 01:29 dir3
external1/dir1:
total 4.5M
-rw-rw-r-- 1 emma emma 769K Oct 31 01:12 a001.jpg
-rw-rw-r-- 1 emma emma 698K Oct 31 01:12 a002.jpg
-rw-rw-r-- 1 emma emma 755K Oct 31 01:12 a003.jpg
-rw-rw-r-- 1 emma emma 656K Oct 31 01:12 a004.jpg
-rw-rw-r-- 1 emma emma 756K Oct 31 01:12 a005.jpg
-rw-rw-r-- 1 emma emma 498K Oct 31 01:12 a006.jpg
-rw-rw-r-- 1 emma emma 455K Oct 31 01:12 a007.jpg
external1/dir2:
total 8.7M
-rw-rw-r-- 1 emma emma 952K Oct 31 01:13 a001.jpg
-rw-rw-r-- 1 emma emma 891K Oct 31 01:13 a002.jpg
-rw-rw-r-- 1 emma emma 838K Oct 31 01:13 a003.jpg
-rw-rw-r-- 1 emma emma 846K Oct 31 01:13 a004.jpg
-rw-rw-r-- 1 emma emma 876K Oct 31 01:13 a005.jpg
-rw-rw-r-- 1 emma emma 834K Oct 31 01:13 a006.jpg
-rw-rw-r-- 1 emma emma 946K Oct 31 01:13 a007.jpg
-rw-rw-r-- 1 emma emma 709K Oct 31 01:13 a008.jpg
-rw-rw-r-- 1 emma emma 1007K Oct 31 01:13 a009.jpg
-rw-rw-r-- 1 emma emma 940K Oct 31 01:13 a010.jpg
external1/dir3:
total 4.6M
-rw-rw-r-- 1 emma emma 408K Oct 31 01:15 a001.jpg
-rw-rw-r-- 1 emma emma 525K Oct 31 01:15 a002.jpg
-rw-rw-r-- 1 emma emma 383K Oct 31 01:15 a003.jpg
-rw-rw-r-- 1 emma emma 512K Oct 31 01:15 a004.jpg
-rw-rw-r-- 1 emma emma 531K Oct 31 01:15 a005.jpg
-rw-rw-r-- 1 emma emma 532K Oct 31 01:15 a006.jpg
-rw-rw-r-- 1 emma emma 400K Oct 31 01:15 a007.jpg
-rw-rw-r-- 1 emma emma 470K Oct 31 01:15 a008.jpg
-rw-rw-r-- 1 emma emma 407K Oct 31 01:15 a009.jpg
-rw-rw-r-- 1 emma emma 470K Oct 31 01:15 a010.jpg
実際のテキストファイルの長さは数千短く、サイズは数メガバイトです。
私がやりたいことは、すべての行がファイルサイズで始まるように、その行からファイルサイズより前のすべての項目を削除することです。例えば
512K Oct 31 01:15 a004.jpg
531K Oct 31 01:15 a005.jpg
532K Oct 31 01:15 a006.jpg
400K Oct 31 01:15 a007.jpg
470K Oct 31 01:15 a008.jpg
ただし、他のすべての行(ディレクトリ名とフルサイズを含む)をそのままにしたいので、またはをcolrm
使用することはできませんcut
。
答え1
解析された出力ls
は信頼できませんが、次のような特別な場合には機能します。
sed -e 's/^.*emma emma //' file
これにより、各行から「emma emma」までのすべての内容が削除されます。文字列が1行に表示されない場合は変更されません。
私が書いた正規表現は、emmaの後の最初のスペースだけを削除し、サイズフィールドが右揃えを維持するようにします(たとえば、「709K」と「1007K」はどちらも1行に同じ数の文字を使用します)。
これを望まない場合は、次を使用します。
sed -e 's/^.*emma emma *//' file
これにより、次のフィールドが始まるまで、emmaの後のすべてのスペースが削除されます。
以下はどんな場合でも動作するsedバージョンですuser group
。
sed -e 's/^.\{10\} [0-9]\+ [^ ]\+ [^ ]\+ //' file
出力の正確な形式に依存しているので、ls
最初のバージョンよりも技術的に悪いです。ただし、特定のファイルで動作する必要があります。
バラよりなぜ`ls`を解析しないのですか?ls 解析がなぜ悪いのかに関する情報です。
すべてのファイルが属していない場合は、emma
このようなawkスクリプトを使用する必要があります。
awk 'NF>2 {print $5,$6,$7,$8,$9} ; NF<3 {print}' file
フィールドが2つ以上の行の場合は、フィールド5-9のみを印刷します。 <3つのフィールドを含む行の場合は、行全体を印刷します。残念ながら、サイズフィールドの正しい位置合わせが失われます。awk
少し複雑なスクリプトを使用して変更できます。
awk 'NF>2 {printf "%5s %s %s %s %s\n", $5, $6, $7, $8, $9} ; NF<3 {print}' file
この最終バージョンは jasonwryan の回答にある for ループを統合するので、単一のスペースを含むファイル名を処理できます (G-Man が述べたように、連続したスペースは除く)。
awk 'NF>2 {printf "%5s", $5; for(i=6;i<=NF;i++){printf " %s", $i}; printf "\n"} ; NF<3 {print}' file
答え2
awkを使用してください:
awk '{if ($1 ~/^-|d/) {for(i=5;i<=NF;i++){printf "%s ", $i}; printf "\n"} else print $0}' file
最初のフィールド-
がまたはで始まる場合は、d
5番目のフィールドから最後のフィールドまで印刷し、それ以外の場合はレコード全体を印刷します。
答え3
-o
100MBのデータについて話しているので、gnu lsと-g
オプションを使用してユーザーとグループを印刷せずに次の形式を取得することをお勧めします。
-rw-rw-r-- 1 952K Oct 31 01:13 a001.jpg
この sed コマンドは、行の先頭から不要なデータを削除します。
sed 's/^[-a-z]{10} \{1,\}[0-9]\{1,\}//'
不要なデータの一覧表示と削除を1段階にまとめることができます(この方法はこのページのほとんどのソリューションにも適用されます)、時間も節約できます。
ls -Rlhog /path/to/directory | sed 's/^[-a-z]\{10\} \{1,\}[0-9]\{1,\}//' > file