2

У меня есть файл со списком каталогов, которые я хотел бы знать, сколько файлов в каждом каталоге.

.../ изображения / 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"

3 ответа3

5

Вы можете использовать цикл for:

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

Если вы хотите, чтобы файлы точек также были включены, используйте ls -a .

Если вы также хотите считать файлы в точечных каталогах, используйте for dir in ./images/* ./images/.*

Если есть не-каталоги, вы можете добавить тест:

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

Если вы хотите прочитать список каталогов из файла, выполните:

   $ 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
0

Используя sh в части команды -exec, вы можете запустить другую оболочку и выполнить ваши команды там довольно хорошо.

находить . -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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .