web-dev-qa-db-ja.com

ディレクトリのリストにあるファイルを数える

各ディレクトリにいくつのファイルがあるか知りたいディレクトリのリストを含むファイルがあります。

.../images/idsuffix/userids /

これにより、各ディレクトリではなく、最初の5つのディレクトリのファイルとディレクトリの数がわかります。

検索./images/00{0..5}/ |トイレ

私が欲しいのは、各ディレクトリのコンテンツの数です。 xargsに渡そうとしましたが、同じことを行い、すべてのディレクトリのカウントを生成します。

ls ./images/ > directories.lst  
cat directories.lst | xargs -i{} find {} | wc 

そして、これはまったく出力を生成しません。

cat directories.lst | xargs -I{} bash -s "find {} | wc"
2
nelaaro

コマンドの-exec部分でshを使用すると、他のシェルを起動して、そこでコマンドを非常にうまく実行できます。

見つける。 -name "* .dat" -exec csh -c'echo -n $ 1; grep ID $ 1 | wc -l '{} {} \;

または私の場合、ディレクトリ内のファイルを数えるとき。 「ls-f」を使用すると、ls出力がソートされずに生成され、カウントする前に出力をソートしようとするのが大幅に高速になります。

ディレクトリ名とカウントの間に改行があります

find/somedir/some/dir -type d -print -exec sh -c'ls -f $ 1/* | wc -l '{} {} \;

出力は次のようになります

/ dir/somedir/002/1066002
6

ディレクトリ名とカウントの間にタブがあります

find/somedir/some/dir -type d -exec bash -c'echo -en "$ 1\t"; ls -f $ 1/* | wc -l '{} {} \;

出力は次のようになります

/ dir/somedir/002/1066002 6

http://www.compuspec.net/reference/os/solaris/find/find_and_execute_with_pipe.shtml

0
nelaaro

Forループを使用できます。

for dir in ./images/* ; do echo $dir ; ls "$dir" | wc ; done

ドットファイルも含める場合は、ls -aを使用します。

Dot-dirsのファイルもカウントしたい場合は、for dir in ./images/* ./images/.*を使用してください。

いくつかの非ディレクトリがある場合は、テストを追加できます。

for dir in ./images/* ; do
    if [[ -d $dir ]] ; then
        echo $dir
        ls "$dir" | wc
    fi
done
5
choroba

ファイルからディレクトリリストを読み取りたい場合は、次のようにします。

   $ for dir in $(cat directories.lst); do echo "$dir : `ls $dir | wc -l`"; done

ただし、次のファイルは必要ありません。

   $ for dir in $(find images/ -type d); do echo "$dir : `ls $dir | wc -l`"; done

また、最上位のディレクトリのみが必要な場合:

   $ for dir in $(find images/ -maxdepth 1 -type d); do echo "$dir : `ls $dir | wc -l`"; done

最後に、ファイル名にスペースがある場合は、次のようにします。

   $ SAVEIFS=$IFS; IFS=$(echo -en "\n\b"); for dir in $(find images/ -type d); do echo "$dir : `ls $dir | wc -l`"; done; IFS=SAVEIFS
2
terdon