指定ディレクトリ以下のファイル数をディレクトリ毎に表示させる方法

このQ&Aのポイント
  • 指定ディレクトリ以下のファイル数をディレクトリ毎に表示させたい場合、findコマンドを使用します。
  • findコマンドを使って、指定ディレクトリ以下のファイルを検索し、それぞれのディレクトリごとにファイル数を表示することができます。
  • 特定のディレクトリ以下のファイル数を確認するためには、findコマンドで対象ディレクトリを指定し、-type fオプションでファイルのみを検索します。そして、-execオプションを使用してwc -lコマンドを組み合わせることで、ファイル数をカウントすることができます。
回答を見る
  • ベストアンサー

find 指定ディレクトリ以下のファイル数をディレクトリ毎に表示させたい

■前提例 ./public_html/rails/modules/abcde/cache/hoge/file1 ./public_html/rails/modules/abcde/cache/file2 ./public_html/ruby/modules/wiki/private/cache/file3 ./net/cache/file4 ./n/abcde/cache/file5  : 以下略 ■期待しているのは、下記二つのディレクトリを検出し、かつそのディレクトリ以下のファイル数を、ディレクトリ毎に表示させたいのですが、 2./public_html/rails/modules/abcde/cache/ 1./n/abcde/cache/  : もしくは、 2./public_html/rails/modules/abcde/cache/hoge/file1 2./public_html/rails/modules/abcde/cache/file2 1./n/abcde/cache/file5  : ■実際に下記コマンドを実行すると、 find . -type f -regex '.*/abcde/cache/.*' -print | wc -l 4503 という数値(恐らくファイル数?)が返ってくるのみです。 ググッてみて、 find . -type f -regex '.*/abcde/cache*/.*' | xargs wc -l find . -type f -regex '.*/abcde/cache/.*' -print | xargs wc -l find . -type f -regex '.*/abcde/cache/.*' -exec wc -l \{\} \; とか色々試してみたのですが、 恐らく行数?が表示されるようで、自分が期待した結果を得ることが できません。 条件で検出したディレクトリ以下のファイル数を、ディレクトリ毎に表示させるには、 どうしたらよいのでしょうか。

  • re999
  • お礼率61% (476/777)

質問者が選んだベストアンサー

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

http://oshiete1.goo.ne.jp/qa5632040.html の続きですね。 >■期待しているのは、下記二つのディレクトリを検出し >./public_html/rails/modules/abcde/cache/ >./n/abcde/cache/ 探す場所がわかっているのなら、 find の開始ディレクトリに指定すれば、それより下だけを探します。 -regexはabcde/cacheを探すために使ったものですし、今回のやり方だと常に真なので削ります。 find ./public_html/rails/modules/abcde/cache ./n/abcde/cache -type f -print >かつそのディレクトリ以下のファイル数を、ディレクトリ毎に表示させたい sedで開始ディレクトリだけ取り出す→sortで並びかえる→uniq に -cオプションつけて重複行を数える。 としてみました find ./public_html/rails/modules/abcde/cache ./n/abcde/cache -type f -print | sed 's/^\(\.\/public_html\/rails\/modules\/abcde\/cache\/\|\.\/n\/abcde\/cache\/\).*$/\1/' test4.txt | sort | uniq -c abcde/cacheがそれぞれに下に含まれていないならもうちょっと簡単に find ./public_html/rails/modules/abcde/cache ./n/abcde/cache -type f -print | sed 's/^\(.*\/abcde\/cache\/\).*$/\1/' test4.txt | sort | uniq -c ここまでくると、シェルスクリプトやperl,awk等を使ったほうがすっきりしそうです。 #!/usr/bin/sh for i in _html/rails/modules/abcde/cache ./n/abcde/cache do echo "`find $i -type f | wc -l` $i" done

re999
質問者

補足

(前回に引き続き)ご回答いただき、ありがとうございます。 おかげで、自分が望む結果を得ることができました。 (簡単なスクリプトでこんなことも出来るんだ、とちょっと感動しました) <補足> >■期待しているのは、下記二つのディレクトリを検出し 説明が悪かったのですが、実際には、/abcde/cache/を 0~複数個探したいという意図でした。 >test4.txt このtest4.txt は何を意味しているのでしょうか? 実際に試したところ、下記のようになりました。 sed: can't read test4.txt: No such file or directory >abcde/cacheがそれぞれに下に含まれていないなら それぞれに下に含まれていないなら、 この部分の意味がよく分かりませんでした。 ■最終的に、試したのが、下記です。 find . -type f -regex '.*/abcde/cache/.*' -print | sed 's/^\(.*\/abcde\/cache\/\).*$/\1/' | sort | uniq -c 85 ./public_html/aa/modules/abcde/cache/ 13 ./public_html/bb/modules/abcde/cache/           :            以下略  それぞれのディレクトリ以下にあるファイル数の一致を 無事確認することができました。 ありがとうございました!

その他の回答 (1)

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.2

すみません。 test4.txt はこちらで動作確認したときに使ったものです。 削ってください。

関連するQ&A

  • 古いファイルを含むディレクトリのリネーム

    古いファイルを含むディレクトリのリネーム Linuxサーバのファイル整理の目的で 指定ディレクトリ以下の階層の複数フォルダについて 古い画像ファイル(90日以上変更がない".jpg"ファイル)しかないものは (1)ディレクトリ名をリネーム(ディレクレトリ名末尾に"_deleted"を追加) (2)ディレクトリ内の古いファイルを削除 したいと考えております。 find と xargs をつなげてあげれば、(2)単体であればできるのですが ex.) find . -type f -ctime +90 -print0 | xargs -0 rm 「格納されている全てのファイルが対象となる場合」に「ディレクトリ名をリネームして」 という処理で悩んでおります。 皆様、アドバイスの程お願い致します。 ========================================== 環境: ========================================== OS: CentOS5.4 bashなどを利用して,簡易的に実行できればと考えております。

  • findコマンド/複数の指定ディレクトリ以下にある、古いファイルを削除する処理を自動実行したい

    ▽やりたいこと abcde/cache/以下にある、1日以上前にあるファイルを全削除するにはどうすればよいでしょうか。 abcde/cache/ファルダは、複数あります。 まず初めにsshで接続して、実際にファイルを探し、削除してから、cronなるものにチャレンジしようと思っていましたが、一番初めのファイルを探すところで躓きました。 find . -name "cache"だと、消したくない、cacheフォルダまで、 検索されてしまうので、 まずは、複数あるabcde/cache/フォルダを探す方法を知りたいです。 ▽step0(ssh) abcde/cache/フォルダを探す ▽step1(ssh) abcde/cache/フォルダ以下のファイル全削除 ▽step2(ssh) abcde/cache/フォルダ以下の、1日以上前にあるファイルを全削除 ▽step3(cron) 上記をcrondで実行 ヒントだけでもよいので、誰か教えてください。

  • シェルのfindコマンドであるディレクトリ以外のファイルを検索

    ホームディレクトリにある.(例.dtや.atok)ディレクトを検索対象から外し尚且つ、*aa*のファイルを検索するにはどうしたら良いでしょうか? find . -type d -name .dt -prune -o -print | xargs grep "*aa*" でいろいろやってみましたができませんでした。 OS:HP-UX K-Shellです どうぞ宜しくお願いいたします。

  • findの結果をlsで詳細表示

    はじめまして。 Linux初心者です。 カレントディレクトリ以下のディレクトリやファイルの一覧を詳細表示するには「find ./ | xargs ls -lF」などとすると思いますが xargsを使用せずに「find ./ | ls -lF」とすると、なぜNGなのでしょうか。「xargs」の意味を調べると、 (1) 標準入力から空白か改行で区切られた文字列群を読み込む。 (2) xargsの引数のコマンドの後ろに、標準入力から受け取った文字列群を付け足して、そのコマンドを実行する。 とありました。上記の説明で「xargs」を付けることによる効果はわかるのですが、ls以外のコマンドを使用する際にもfindと組み合わせる際には、 すべてのコマンドで「xargs」を使用しなければいけないのでしょうか。 lsの結果をmoreする際などには、「ls | more」で良いと思うのですが、 「ls | xargs more」としない理由がわかりません。 どなたかわかりやすく教えて頂ければ幸いです。 よろしくお願いします。

  • カレントディレクトリ内のファイル検索

    Windows2003環境で、カレントディレクトリ下に存在するwmvファイル数をカウントしたい。UNIXでいう[find ./ -name *.wmv |wc -l] 何かよい方法はありませんでしょうか?

  • findで7日前のディレクトリを検知、そのディレクトリを消したい。

    findオプションで質問です。 7日以前のディレクトリ/ファイルを検索して消したいです。 find ~ -mtime +7 -type -df -exec rm -df {} なんて感じで宜しいのでしょうか。 -df というように、ディレクトリ/ファイルを両方いっぺんに 指定できますか? 宜しくお願いいたします。

  • unixのfindコマンド

    unixのfindコマンドで、ある複数のディレクトリから指定のファイル名だけを 検索し、その結果をgrepしたいのですが、 例えば 01_dir 02_dir : 11_di : 21_dir : と言うディレクトリがあります。 そこから、「0」で始まっているディレクトリの中なら拡張子が*.txtを 検索し、その検索したファイルに対して、grepを実行したいのですが、 上手くいきません。 もちろん、各ディレクトリには、「.txt」以外のファイルもありますし、 ファイル名にも条件を付与したいです。 以下の様に、 find . -name "0*_dir" -type d -print | xargs ls -l *.txt | grep "検索文字" find . -name "0*_dir" -type d -print | xargs ls *.txt | grep "検索文字" find . -name "0*_dir" -type d -print | xargs -i ls -l '{} /*.txt' | grep "検索文字" find . -name "0*_dir" -type d -print | xargs -i ls {} "検索文字" とやってみたのですがだめでした。 find ./ -type d \( -name '1_*dir' -o -name '2*_dir' -o -name '3*_dir' \) -prune -o -type f -print と「-prune」で除外するディレクトリを指定すればできなくはないですが、 すべてのディレクトリ書くのはいい方法ではないです。 よい方法をお願いします。 OSは、Solaris 11.3です。

  • findとxargsの使い方で

    unixで、findとxargsを使って検索を行っています。 以下の様に、 find . -type f | xargs コマンド 例えば、 find . -type f | xargs ls -l を実行すると、 「xargs: 入力ファイルが壊れています。: バイトシーケンスが正しくありません。」 が出力されます。 何が原因なのでしょうか。 また、解消方法はどのようにすればよいのでしょうか。 環境は solaris10 LANG=ja_JP.UTF-8 sh or bash

  • findでファイル抽出が行えない

    findコマンドの使い方について、 疑問がありますで、掲示いたします。 【質問】 今、以下の同名のファイル名が存在しています。 [root@centos5 ~]# ls -l /etc/httpd/modules/mod_actions.so -rwxr-xr-x 1 root root 9628 10月 21 06:05 /etc/httpd/modules/mod_actions.so [root@centos5 ~]# ls -l /usr/lib/httpd/modules/mod_actions.so -rwxr-xr-x 1 root root 9628 10月 21 06:05 /usr/lib/httpd/modules/mod_actions.so この状態で、以下のようにfindコマンドを実行しました。 find / -name mod_actions.so すると、以下の結果が表示されました。 [root@centos5 ~]# find / -name mod_actions.so /usr/lib/httpd/modules/mod_actions.so 【確認】 /etc/httpd/modules/mod_actions.soが何故、表示されないのでしょうか。 上記コマンドのコマンドの構文が不適切だからなのか。 こちら、上記2ファイルを抽出するfindの構文を教えて頂けないでしょうか。 以上、よろしくお願いいたします。

  • SJISファイルを日本語でgrep

    UNIX環境で、 SJISファイルを日本語でgrepしたのですが、 ファイル名が出力されずにうまくいきません。 どなたかご教授願えないでしょうか。 [自分のコマンド] find ./ -type f -print | xargs nkf -e | grep 'テスト' とし、日本語は検地できたのですが、 ファイル名が出力されずに困っております。 grep -l としたら、↓のエラーが表示されました。 xargs: nkf: シグナル 13 によって終了しました サブディレクトリも含めて検地したいのですが、 なにかいい方法ありますでしょうか。