TL, DR:
rsync -am --include='*.pdf' --include='*/' --exclude='*' ~/LaTeX/ ~/Output/
Rsync копирует источник (источники) в место назначения. Если Вы передаете *.pdf
как источники, оболочка разворачивает это до списка файлов с .pdf
расширение в текущем каталоге. Никакого рекурсивного обхода не происходит, потому что Вы не передали каталога как источника.
Таким образом, необходимо работать rsync -a ~/LaTeX/ ~/Output/
, но с фильтром, чтобы сказать rsync копировать .pdf
файлы только. Правила фильтра Rsync могут казаться пугающими, когда Вы читаете руководство, но можно создать много примеров со всего несколькими простыми правилами.
Включения и исключения:
--exclude=*~
, --exclude=/some/relative/location
(относительно исходного аргумента, например, это исключает ~/LaTeX/some/relative/location
).--include=*/
), затем исключите остальных с --exclude='*'
. Это вызвано тем, что:--include='directory/***'
сделает это.Шаблоны:
/
, это относится к имени файла без каталога./
, это относится к каталогам только./
, это относится к целому пути от каталога, который был передан как аргумент rsync
.*
любая подстрока единственного компонента каталога (т.е. никогда не соответствует /
); **
соответствия любая подстрока пути.Если исходный аргумент заканчивается a /
, его содержание копируется (rsync -r a/ b
создает b/foo
для каждого a/foo
). Иначе сам каталог копируется (rsync -r a b
создает b/a
).
Таким образом здесь мы должны включать *.pdf
, включайте каталоги, содержащие их, и исключите все остальное.
rsync -a --include='*.pdf' --include='*/' --exclude='*' ~/LaTeX/ ~/Output/
Обратите внимание, что это копирует все каталоги, даже те, которые не содержат файла соответствия или подкаталога, содержащего один. Этого можно избежать с --prune-empty-dirs
опция (это не универсальное решение, так как Вы затем не можете скопировать каталог даже путем соответствия ему явно, но это - редкое требование).
rsync -am --include='*.pdf' --include='*/' --exclude='*' ~/LaTeX/ ~/Output/
find -maxdepth 1 -type d | while read -r dir; do printf "%s:\t" "$dir"; find "$dir" -type f | wc -l; done
Благодаря Gilles и xenoterracide для безопасности/совместимости фиксирует.
Первая часть: find -maxdepth 1 -type d
возвратит список всех каталогов в текущем рабочем каталоге. Это передается по каналу к...
Вторая часть: while read -r dir; do
начинает некоторое время цикл - пока канал, входя, в то время как открыто (который является, пока весь список каталогов не отправляется), команда чтения поместит следующую строку в переменный "dir". Затем это продолжается...
Третья часть: printf "%s:\t" "$dir";
распечатает строку в "$dir" (который содержит одни из имен каталогов), сопровождаемый вкладкой.
Четвертая часть: find "$dir -f file"
входит в список всех файлов в имени каталога, сохраненном в "$dir". Этот список отправляется в..
Пятая часть: wc -l;
считает количество строк, которые отправляются в его стандартный вход.
Заключительная часть: done
просто заканчивает цикл с условием продолжения.
Таким образом, мы получаем список всех каталогов в текущем каталоге. Для каждого из тех каталогов мы генерируем список всех файлов в нем так, чтобы мы могли считать их всех использованием wc -l
. Результат будет похож:
./dir1: 234
./dir2: 11
./dir3: 2199
...
Попытка:
find /path/to/start/at -type f -print | wc -l
как начальная точка, или если Вы действительно только хотите рекурсивно вызвать через подкаталоги каталога (и пропустить файлы в том высокоуровневом каталоге)
find `find /path/to/start/at -mindepth 1 -maxdepth 1 -type d -print` -type f -print | wc -l
find
работы рекурсивно через все подкаталоги по умолчанию. Если Вы хотите, чтобы это работало в нескольких местоположениях, можно указать всех их между find
и -type
.
– Didier Trosset
16.11.2010, 16:33
698035
. Я должен заняться 6 числами. слишком рекурсивный
– xenoterracide
16.11.2010, 23:02
/home
? Я был бы на 100% уверен, что Вы не делаете. бормотание
– Cry Havok
17.11.2010, 19:28
Следующее решение считает фактическое количество используемого inodes, начинающего с текущего каталога:
find . -print0 | xargs -0 -n 1 ls -id | cut -d' ' -f1 | sort -u | wc -l
Для получения количества файлов того же подмножества используйте:
find . | wc -l
Для решений, исследуя только подкаталоги, не принимая во внимание файлы в текущем каталоге, можно обратиться к другим ответам.
find -printf '%i\n' | sort -u | wc -l
. Если бы Вы хотели быть портативными, то Вам было бы нужно find . -exec ls -id {} + | cut …
вместо этого.
– Gilles 'SO- stop being evil'
19.11.2010, 22:24
Дайте этому попытку:
find -type d -print0 | xargs -0 -I {} sh -c 'printf "%s\t%s\n" "$(find "{}" -maxdepth 1 -type f | wc -l)" "{}"'
Это должно хорошо работать, если имена файлов не включают новые строки.
-maxdepth 1
сразу после первого find
. Если Вы хотите включать количество подкаталогов в Вашем количестве, удалите -type f
в конце (который должен был действительно быть ! -type d
так или иначе, так, чтобы все файлы некаталога были бы включены).
– Paused until further notice.
17.11.2010, 01:15
Вот компиляция некоторых полезных команд списка (перехеширована на основе предыдущего пользовательского кода):
Папки списка с количеством файла:
find -maxdepth 1 -type d | sort | while read -r dir; do n=$(find "$dir" -type f | wc -l); printf "%4d : %s\n" $n "$dir"; done
Папки списка с ненулевым количеством файла:
find -maxdepth 1 -type d | sort | while read -r dir; do n=$(find "$dir" -type f | wc -l); if [ $n -gt 0 ]; then printf "%4d : %s\n" $n "$dir"; fi; done
Папки списка с количеством подпапки:
find -maxdepth 1 -type d | sort | while read -r dir; do n=$(find "$dir" -type d | wc -l); let n--; printf "%4d : %s\n" $n "$dir"; done
Папки списка с ненулевым количеством подпапки:
find -maxdepth 1 -type d | sort | while read -r dir; do n=$(find "$dir" -type d | wc -l); let n--; if [ $n -gt 0 ]; then printf "%4d : %s\n" $n "$dir"; fi; done
Перечислите пустые папки:
find -maxdepth 1 -type d | sort | while read -r dir; do n=$(find "$dir" | wc -l); let n--; if [ $n -eq 0 ]; then printf "%4d : %s\n" $n "$dir"; fi; done
Перечислите непустые папки с довольным количество:
find -maxdepth 1 -type d | sort | while read -r dir; do n=$(find "$dir" | wc -l); let n--; if [ $n -gt 0 ]; then printf "%4d : %s\n" $n "$dir"; fi; done
Попробовать find . -type f | wc -l
, это рассчитает всех файлов в текущем каталоге, а также всех файлов в подкаталогах. Обратите внимание, что все каталоги не будут считаться как файлы, только обычные файлы делают.
OS X 10.6 давит на команду в принятом ответе, так как в ней не указан путь для find
. Вместо этого используйте:
find . -maxdepth 1 -type d | while read -r dir; do printf "%s:\t" "$dir"; find "$dir" -type f | wc -l; done
Я знаю, что опаздываю на вечеринку, но я верю, что этот чистый bash
(или другая оболочка, которая принимает двойной звездный шар) решение может быть намного быстрее в некоторых ситуациях:
shopt -s globstar # to enable ** glob in bash
for dir in */; do a=( "$dir"/**/* ); printf "%s\t%s\n" "$dir:" "${#a[*]}"; done
вывод:
d1/: 302
d2/: 24
d3/: 640
...
Если у вас установлено ncdu
(, которое необходимо -, когда вы хотите выполнить некоторую очистку ), просто введите c
для «Переключить отображение количества дочерних элементов». И C
на «Сортировать по элементам».
Я не уверен, почему никто (, в том числе и я ), не знал о:
du --inodes
--inodes
list inode usage information instead of block usage
Я почти уверен, что это решает проблему ОП. Я начал часто использовать его, чтобы узнать, где находится весь хлам на моих огромных дисках (, и выгрузить его на более старый диск ).
Если вы НЕ хотите использовать рекурсию (, которая может быть полезна в других ситуациях ), добавьте
-S, --separate-dirs
read -r
как плоскостьread
обратные косые черты обработок особенно. Затемecho -en "$dir:\t"
снова исказит обратные косые черты; простая фиксация должна использоватьprintf '%s:\t' "$dir"
вместо этого.Далее,$dir
должен быть"$dir"
(всегда используйте двойные кавычки вокруг подстановок переменных). – Gilles 'SO- stop being evil' 18.11.2010, 03:40find -maxdepth 1 -type d | while read -r dir; do printf "%s:\t" "$dir"; find "$dir" | wc -l; done
– xenoterracide 18.11.2010, 11:30sort -n -r -k2
в конец этого, для большого количества каталогов, так, чтобы я знал, где большая часть использования – xenoterracide 25.01.2011, 12:45-type f
заставить его перечислить файлы:find -maxdepth 1 -type d | while read -r dir; do printf "%s:\t" "$dir"; find "$dir" -type f | wc -l; done
– Krzysztof Boduch 20.06.2014, 15:02illegal option -- m
вfind
команда. Я изменил его наfind . -maxdepth ...
и заставил это работать. – Jeff 24.07.2017, 16:28