Как я могу выполнить поиск по глубине с помощью `find`?

Это очень старый вопрос, но я отвечу на него для людей, которые прочтут его в будущем.

Если в URL-адресе изменяется только число, вы можете изменить это число, как указано ниже. Если это разные URL-адреса, вы можете использовать решение jasonwryan.

google-chrome --new-tab http://www.url{1..4}.com

Приведенная выше команда будет расширяться, как показано ниже, в новых вкладках Google Chrome:

http://www.url1.com http://www.url2.com http://www.url3.com http://www.url4.com

Обычно это решение загружает все страницы, где вам нужно будет сделать следующее, а затем пройти по страницам.

13
29.04.2016, 03:28
4 ответа

Вы можете направить свой find в сортировку, которая сортирует в основном по количеству символов / в имени пути . Например,

find alpha |
awk '{n=gsub("/","/",$0);printf "%04d/%s\n",n,$0}' |
sort -t/ |
sed 's|[^/]*/||'

Здесь используется awk для префикса пути с количеством косых черт и sed для удаления этого префикса в конце.

На самом деле, поскольку вы, вероятно, хотите, чтобы содержимое каталога alpha / charlie + было указано после alpha / charlie , вам нужно сказать sort -t / -k1, 1 -k2,2 -k3,3 -k4,4 до желаемой глубины.

3
27.01.2020, 19:53

Вы можете сделать это, используя только подстановочные знаки shell. Постройте шаблон с постепенно увеличивающимися уровнями каталогов.

pattern='*'
set -- $pattern
while [ $# -ne 1 ] || [ "$1" != "$pattern" ]; do
  for file; do
    …
  done
  pattern="$pattern/*"
  set -- $pattern
done

Это пропускает точечные файлы. Используйте FIGNORE='.?(.)' в ksh, shopt -s dotglob в bash или setopt glob_dots в zsh, чтобы включить их.

Предостережения:

  • При большом количестве файлов это приведет к переполнению памяти.
  • Это рекурсивно обходит символические ссылки на каталоги.

Если вы хотите выбрать порядок каталогов и некаталогов, и производительность не критична, вы можете сделать два прохода и проверить [ -d "$file" ] на каждом проходе.

6
27.01.2020, 19:53

# cat./bfind

#!/bin/bash
i=0
while results=$(find "$@" -mindepth $i -maxdepth $i) && [[ -n $results ]]; do
  echo "$results"
  ((i++))
done

Это работает путем увеличения глубины findи повторения, я думаю, что это может повторять результаты, но может быть легко отфильтровано

7
27.01.2020, 19:53

Другой ответ не основан на «поиске», а на bash -сначала используйте «длину родительского каталога», а затем сортируйте по альфа-каналу.

Ответ не совсем совпадает, так как в ваших результатах есть "charlie, bravo, delta", но мне интересно, должно ли это быть "bravo, charlie, delta" в альфа-порядке.

paths_breadth_first() {
  while IFS= read -r line; do
    dirn=${line%/*}         ## dirname(line)
    echo ${#dirn},$line     ## len(dirn),line
  done | sort -n | cut -d ',' -f 2-
}

Это производит

  $ cat /tmp/yy | paths_breadth_first 
  alpha
  alpha/bravo
  alpha/charlie
  alpha/delta
  alpha/charlie/alpha
  alpha/charlie/beta
  alpha/charlie/gamma
  alpha/charlie/phi
0
27.01.2020, 19:53

Теги

Похожие вопросы