Eu tenho um script simples que eu entendo mais, é o comando find que não está claro. Eu tenho muita documentação, mas ela não está servindo para torná-la muito mais clara. Meu pensamento é que ele está trabalhando como um para-loop, o arquivo encontrado atualmente é trocado dentro para {} e copiados para $ HOME / $ dir_name, mas como é que a pesquisa com -caminho e -o -prune trabalho? É irritante ter essa documentação específica e relevante e ainda não saber o que está acontecendo.
#!/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
Esta é apenas a documentação que eu sei que deveria ser capaz de descobrir.
-path padrão
O nome do arquivo corresponde ao padrão do shell. Os metacaracteres não tratam / ou . especialmente; então, por exemplo, encontre. -path "./sr*sc" imprimirá uma entrada para um diretório chamado ./src/misc (se houver). Para ignorar uma árvore de diretórios inteira, use -prune em vez de verificar todos os arquivos na árvore. Por exemplo, para pular o diretório src / emacs e todos os arquivos e diretórios abaixo dele, e imprimir os nomes dos outros arquivos encontrados, faça algo assim:
find . -path ./src/emacs -prune -o -print
- Ação: comando -exec; Essa variante insegura da ação -execdir é especificada pelo POSIX. A principal diferença é que o comando é executado no diretório a partir do qual a localização foi invocada, o que significa que {} é expandido para um caminho relativo começando com o nome de um dos diretórios iniciais, em vez de apenas o nome base do arquivo correspondente.
Enquanto algumas implementações de find substituem o {} somente onde ele aparece por si só em um argumento, o GNU find substitui {} onde quer que ele apareça.
E
Por exemplo, para comparar cada arquivo de cabeçalho C no diretório atual ou abaixo do diretório com o arquivo / tmp / master:
find . -name '*.h' -execdir diff -u '{}' /tmp/master ';'
Respostas:
-path
funciona exatamente como-name
, mas aplica o padrão ao nome do caminho inteiro do arquivo que está sendo examinado, em vez do último componente.-prune
proíbe a descida abaixo do arquivo encontrado, caso seja um diretório.Juntando tudo, o comando
$HOME
.$HOME/$dir_name
ele não ficará abaixo dele ("remove" o subdiretório).-o
), se encontrar um arquivo correspondente,*$file_suffix
copie-o para$HOME/$dir_name/
.A idéia parece fazer um backup de parte do conteúdo de
$HOME
um subdiretório de$HOME
. As peças com-prune
são obviamente necessárias para evitar fazer backups de backups ...fonte
-path
funciona exatamente como-name
: seleciona arquivos. A diferença é que-name
combina um padrão com o nome do arquivo, enquanto que-path
combina um padrão com o nome do caminho completo.find
sempre desce em subdirectórios, a não ser impedido por-maxdepth
ou-prune
etc-path $HOME/$dir_name
é uma ação. É um teste que verifica se o caminho do arquivo atual sendo examinado corresponde ao que$HOME/$dir_name
for.-prune
é uma ação separada. Acho que a primeira frase do seu primeiro comentário reflete com precisão como isso funciona.Faz parte do comando find, a instrução -exec.
Ele permite que você interaja com o arquivo / diretório encontrado pelo
find
comando.find $HOME -path $HOME/$dir_name -prune -o -name "*$file_suffix" -exec cp {} $HOME/$dir_name/ \;
find $HOME
significa encontrar arquivos / diretórios em $ HOMEPara entender
-path <some_path>
, veja `find -path` explicadoPara entender
-prune
, consulte /programming/1489277/how-to-use-prune-option-of-find-in-sh-o
significa OR, então-path <some_path>
OR-name *$file_suffix
-exec
significa executar o comando.cp {} $HOME/$dir_name/
copie todos os arquivos correspondentes a$HOME/$dir_name/
\;
significa encerrar o-exec
comandofonte