С помощью оболочки найдите все подкаталоги, которые содержат определенные файлы

Я пытаюсь использовать shell, чтобы найти все подкаталоги в любом каталоге. Я хотел бы иметь файл .sh (файл сценария оболочки), который может принимать в качестве параметра имя интересующего меня каталога и список файлов, которые я хочу найти (ПРИМЕЧАНИЕ. Я хочу только подкаталоги которые имеют все эти файлы).

Я знаю, что могу использовать это:

find $D -perm -u=rx -type f

Где D - это каталог, -u - это пользователь, r - это право пользователей на чтение, а x - это право на изменение, я верю, но хм. Я понятия не имею, как заставить файл принимать параметры, и я не знаю, как использовать -u = rx

РЕДАКТИРОВАТЬ: Теперь я понимаю, как использовать параметры для файла сценария оболочки, так что все в порядке. Я до сих пор не получаю большую часть остального.

Мне бы понравилось, если бы кто-то мог объяснить код, который я упомянул, или ... дать альтернативу?

Я тоже согласен с частичным ответом, мне просто нужна помощь.

2
задан 9 May 2012 в 17:17

2 ответа

Я интерпретировал бы Ваши требования, поскольку "находят все подкаталоги, которые содержат все определенные файлы"

#!/bin/bash
parent_dir="$1"
shift
find "$parent_dir" -type d |
while IFS= read -r subdir; do
  all_present=true
  for file in "$@"; do
    if [[ ! -f "$subdir/$file" ]]; then
      all_present=false
      break
    fi
  done
  $all_present && echo "$subdir"
done

, "IFS =" и "читала,-r" части гарантируют, что значение "dir" содержит фактическое имя каталога, даже если она включает пробелы или специальные символы.

1
ответ дан 9 May 2012 в 17:17

Если я понимаю правильно, что Вы хотите сделать, это - решение:

#!/bin/sh

USAGE="Usage: $0 dir file1 file2 ... fileN\nto find all subdirectories of dir that contain all the given files.\n"

if [ "$#" == "0" ]; then
    printf "$USAGE"
    exit 1
fi

ARG=""
DIR=$1
shift

while (( "$#" )); do
  ARG="$ARG -exec test -e \"{}/$1\" \; "
  shift
done

cmd="find $DIR -type d $ARG -print"
eval $cmd

То, что это делает, является этим:

Использование find ... -type d найти все подкаталоги (включая каталог данными как первый параметр). test -e управляйте проверками, если файл существует. Таким образом для данного каталога мы должны проверить все файлы, данные в командную строку: тестовый-e/path/to/directory/file1 тестирует тестовый-e/path/to/directory/file3-e/path/to/directory/file2... /path/to/directory {} - единственный результат находки. Затем находить-параметр -exec может использоваться для проверки на единственный файл. Проверять на все файлы несколько -exec test параметры необходимы. Так сборка цикла с условием продолжения список там параметров, затем этот список соединен в единственной команде и оценен.

Весело провести время...

1
ответ дан 9 May 2012 в 17:17

Другие вопросы по тегам:

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