Я пытаюсь использовать shell, чтобы найти все подкаталоги в любом каталоге. Я хотел бы иметь файл .sh (файл сценария оболочки), который может принимать в качестве параметра имя интересующего меня каталога и список файлов, которые я хочу найти (ПРИМЕЧАНИЕ. Я хочу только подкаталоги которые имеют все эти файлы).
Я знаю, что могу использовать это:
find $D -perm -u=rx -type f
Где D - это каталог, -u - это пользователь, r - это право пользователей на чтение, а x - это право на изменение, я верю, но хм. Я понятия не имею, как заставить файл принимать параметры, и я не знаю, как использовать -u = rx
РЕДАКТИРОВАТЬ: Теперь я понимаю, как использовать параметры для файла сценария оболочки, так что все в порядке. Я до сих пор не получаю большую часть остального.
Мне бы понравилось, если бы кто-то мог объяснить код, который я упомянул, или ... дать альтернативу?
Я тоже согласен с частичным ответом, мне просто нужна помощь.
Я интерпретировал бы Ваши требования, поскольку "находят все подкаталоги, которые содержат все определенные файлы"
#!/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" содержит фактическое имя каталога, даже если она включает пробелы или специальные символы.
Если я понимаю правильно, что Вы хотите сделать, это - решение:
#!/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
параметры необходимы. Так сборка цикла с условием продолжения список там параметров, затем этот список соединен в единственной команде и оценен.
Весело провести время...