У меня есть простой скрипт, который я понимаю больше всего, это команда find, которая неясна. У меня много документации, но она не очень понятна. Моя мысль в том , что он работает как для цикла, то в настоящее время находится файл обменен в течение {} и скопировать в $ HOME / $ DIR_NAME, но как поиск с -path и -prune -o работой? Досадно иметь такую конкретную и актуальную документацию и все еще не знать, что происходит.
#!/bin/bash
# The files will be search on from the user's home
# directory and can only be backed up to a directory
# within $HOME
read -p "Which file types do you want to backup " file_suffix
read -p "Which directory do you want to backup to " dir_name
# The next lines creates the directory if it does not exist
test -d $HOME/$dir_name || mkdir -m 700 $HOME/$dir_name
# The find command will copy files that match the
# search criteria ie .sh . The -path, -prune and -o
# options are to exclude the backdirectory from the
# backup.
find $HOME -path $HOME/$dir_name -prune -o \
-name "*$file_suffix" -exec cp {} $HOME/$dir_name/ \;
exit 0
Это просто документация, из которой я знаю, что смогу понять это.
шаблон пути
Имя файла соответствует шаблону оболочки. Метасимволы не обрабатывают / или . специально; так, например, найди. -path "./sr*sc" напечатает запись для каталога с именем ./src/misc (если он существует). Чтобы игнорировать все дерево каталогов, используйте -prune вместо проверки каждого файла в дереве. Например, чтобы пропустить каталог src / emacs и все файлы и каталоги в нем, и напечатать имена других найденных файлов, сделайте что-то вроде этого:
find . -path ./src/emacs -prune -o -print
- Действие: команда -exec; Этот небезопасный вариант действия -execdir указан в POSIX. Основное отличие состоит в том, что команда выполняется в каталоге, из которого была вызвана команда find , это означает, что {} раскрывается в относительный путь, начинающийся с имени одного из начальных каталогов, а не только с базового имени соответствующего файла.
В то время как некоторые реализации find заменяют {} только там, где оно появляется само по себе в аргументе, GNU find заменяет {} везде, где оно появляется.
А также
Например, чтобы сравнить каждый заголовочный файл C в или ниже текущего каталога с файлом / tmp / master:
find . -name '*.h' -execdir diff -u '{}' /tmp/master ';'
Ответы:
-path
работает точно так же-name
, но применяет шаблон ко всему пути к файлу, который проверяется, а не к последнему компоненту.-prune
запрещает спускаться ниже найденного файла, если это был каталог.Собрав все вместе, команда
$HOME
.$HOME/$dir_name
ему, он не будет идти ниже («подрезает» подкаталог).-o
), если он найдет соответствующий файл, скопирует*$file_suffix
его в$HOME/$dir_name/
.Похоже, идея сделать резервную копию некоторого содержимого
$HOME
в подкаталоге$HOME
. Части с-prune
явно необходимы, чтобы избежать создания резервных копий ...источник
-path
работает так же, как-name
: он выбирает файлы. Разница в том, что-name
шаблон соответствует имени файла, а-path
шаблон соответствует полному пути.find
всегда спускается в подкаталоги, если это не предотвращено-maxdepth
и-prune
т. д.-path $HOME/$dir_name
это одно действие. Это тест, который проверяет, совпадает ли путь текущего проверяемого файла с тем, что$HOME/$dir_name
есть.-prune
это отдельное действие. Я думаю, что первое предложение вашего первого комментария точно отражает, как это работает.Это часть команды find, оператор -exec.
Это позволяет вам взаимодействовать с файлом / каталогом, найденным
find
командой.find $HOME -path $HOME/$dir_name -prune -o -name "*$file_suffix" -exec cp {} $HOME/$dir_name/ \;
find $HOME
означает найти файлы / каталоги в $ HOMEЧтобы понять
-path <some_path>
, смотрите объяснение `find -path`Чтобы понять
-prune
, см. Https://stackoverflow.com/questions/1489277/how-to-use-prune-option-of-find-in-sh-o
означает ИЛИ, так-path <some_path>
ИЛИ-name *$file_suffix
-exec
значит выполнить команду.cp {} $HOME/$dir_name/
скопировать любые файлы, соответствующие$HOME/$dir_name/
\;
значит прекратить-exec
командуисточник