2017-04-24 3 views
1

が、私はこの動作を理解するのに苦労していxargsの:CSHのawkを経由してフェッチ・フィールドは、内部

スクリプトの動作:(日付を含む)のファイルを読み込みます。マルチレベルのディレクトリツリーにファイルのリストを印刷し、そのサイズを取得し、ファイルサイズのみを出力します(今後の手順:ファイルサイズの合計)。スクリプトの開始

cat dates | xargs -I {} sh -c "echo '{}: '; du -d 2 "/folder/" | grep {} | head" 
2000-03: 
1000 /folder/2000-03balbasldas 
2000-04: 
12300 /folder/2000-04asdwqdas 
[and so on] 

しかし、私は最初のフィールドにawkを介して、フィルタリングしようとしたとき、私はまだ

cat dates | xargs -I {} sh -c "echo '{}: '; du -d 2 "/folder/" | grep {} | awk '{print $1}'" 
2000-03: 
    1000 /folder/2000-03balbasldas 
    2000-04: 
    12300 /folder/2000-04asdwqdas 

行全体を取得するには、私はすでに除算らを経由して、それに近づいてきました-impera、そして次のコマンドは、うまく作品:

du -d 2 "/folder/" | grep '2000-03' | awk '{print $1}' 
1000 

私は何か非常に些細なものを見逃しているのではないかと心配していますが、これまでのところ何も見つかりませんでした。

ありがとう!

入力

ls -l 
drwxr-xr-x 2 user staff 68 Apr 24 11:21 2000-03-blablabla 
drwxr-xr-x 2 user staff 68 Apr 24 11:21 2000-04-blablabla 
drwxr-xr-x 2 user staff 68 Apr 24 11:21 2000-05-blablabla 
drwxr-xr-x 2 user staff 68 Apr 24 11:21 2000-06-blablabla 
drwxr-xr-x 2 user staff 68 Apr 24 11:21 2000-06-blablablb 
drwxr-xr-x 2 user staff 68 Apr 24 11:21 2000-06-blablablc 
[...] 

cat dates 
2000-03 
2000-04 
2000-05 
[...] 

予想される出力:そのフォルダに含まれるすべてのファイルが占有するディスク容量の合計YYYY-MM-random_dataと文字列を含むファイルの名前を含むディレクトリのフォルダ日付

2000-03: 1000 
2000-04: 2123 
2000-05: 1222112 
[...] 

====== ファイル内の文字列を名前含めますしかし、特に、私はなぜawkが$ 1の列を取得できないのか興味があります。

+0

最小限の入力と正確な出力をお探しください。あなたの試みがどう失敗したかを述べるのではなく。 – Inian

+0

@Inian詳細が追加されました。 – Rob013

答えて

1

[OK]を私は、多くの研究の後に自分自身で答えを見つけたようです:D 私はここにそれを誰か他の人を助けることを望んで、それを投稿します。

https://unix.stackexchange.com/questions/282503/right-syntax-for-awk-usage-in-combination-with-other-command-inside-xargs-sh-c

トリックは$記号をエスケープすることでした。 GNUが、それはこのようになりますを使用して並列

cat dates | xargs -I {} sh -c "echo '{}: '; du -d 2 "/folder/" | grep {} | awk '{print \$1}'" 
0

parallel --tag "eval du -s folder/{}* | perl -ne '"'$s+=$_ ; END {print "$s\n"}'"'" :::: dates 

--tagは、日付の行を付加します。

{}は、日付に置き換えられます。

eval du -s folder/{}*は、日付で始まるすべてのディレクトリを検索し、それらのディレクトリから合計duを返します。

du

からの出力アップperl -ne '$s+=$_ ; END {print "$s\n"}'和は最後にそれを正しく引用され得るために策略を引用のビットがあります。

関連する問題