Tenho um script simples que entendo a maior parte, é o comando find que não está claro. Tenho muita documentação, mas não serve para torná-la muito mais clara. Minha opinião é que está funcionando como um loop for, o arquivo atualmente encontrado é trocado por {} e copiado para $ HOME / $ dir_name, mas como faz a pesquisa com -path e -prune -o funciona? É irritante ter uma documentação tã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 isso em.

-padrão do caminho

O nome do arquivo corresponde ao padrão do 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ório 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 sob ele, e imprimir os nomes dos outros arquivos encontrados, faça algo assim:

find . -path ./src/emacs -prune -o -print

De Manual Findutils

– Ação: comando -exec; Esta variante insegura da ação -execdir é especificada por POSIX. A principal diferença é que o comando é executado no diretório a partir do qual find foi invocado, 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 de base do arquivo correspondente.

Embora algumas implementações de find substituam o {} apenas onde ele aparece por conta própria em um argumento, GNU find substitui {} onde quer que apareça.

E

Por exemplo, para comparar cada arquivo de cabeçalho C dentro ou abaixo do diretório atual com o arquivo / tmp / master:

 find . -name "*.h" -execdir diff -u "{}" /tmp/master ";" 

Comentários

  • Possível duplicata de find: prune não ignora o caminho especificado
  • Acho que é ‘ uma duplicata de find-path explicado mesmo se a resposta em find: prune não ignora o p especificado ath tem uma resposta que parece se aplicar a esta pergunta. Talvez as respostas find-path explicadas façam sentido para alguém mais experiente com scripts, mas elas não ‘ não me ajudam. As respostas presentes aqui fazem mais sentido para mim até agora, embora eu ‘ esteja apenas começando a examiná-las.

Resposta

-path funciona exatamente como -name, mas aplica o padrão ao nome do caminho completo do arquivo que está sendo examinado, ao invés do último componente.

-prune proíbe descer abaixo do arquivo encontrado, no caso de ser um diretório.

Juntando tudo, o comando

find $HOME -path $HOME/$dir_name -prune -o -name "*$file_suffix" -exec cp {} $HOME/$dir_name/ \; 
  1. Começa a procurar arquivos em $HOME.
  2. Se encontrar um arquivo que corresponda a $HOME/$dir_name, ele não “irá abaixo dele (” removerá “o subdiretório).
  3. Caso contrário (-o) se encontrar um arquivo correspondente a *$file_suffix, o copia para $HOME/$dir_name/.

A ideia parece ser fazer um backup de parte do conteúdo de $HOME em um subdiretório história de $HOME. As partes com -prune são obviamente necessárias para evitar fazer backups de backups …

Comentários

  • Se eu entendi então: find iterará por meio de cada um dos diretórios em $ HOME em que tenha permissão para entrar, exceto $ HOME / $ dir_name, ao qual não descerá (porque a ação de remoção será avaliada como verdadeira ou não será levado), procurando por arquivos que terminam com $ file_suffix. Então, assim que encontrar um, ele executará cp ” found_file.sh ” em $ HOME / $ dir_name? Além disso, -path permite um caminho para um arquivo e é útil quando você deseja localizar para descer em diretórios e não apenas trabalhar no diretório atual?
  • Seu entendimento é quase correto. -path funciona da mesma forma que -name: seleciona arquivos. A diferença é que -name corresponde a um padrão para o nome do arquivo, enquanto -path corresponde a um padrão para o nome do caminho completo. find sempre desce em subdiretórios, a menos que seja impedido por -maxdepth ou -prune etc.
  • Oh!-path está sendo aplicado a $ HOME / $ dir_name -prune então, ele ‘ sa ordem dos comandos que estavam me bagunçando, e -path é necessário para o comando prune porque ele precisa corresponder ao caminho completo do diretório removido.
  • @Darren I ‘ Não tenho certeza se ‘ é bastante preciso. -path $HOME/$dir_name é uma ação. É um teste que verifica se o caminho do arquivo atual sendo examinado corresponde a qualquer $HOME/$dir_name. -prune é uma ação separada. Acho que a primeira frase do seu primeiro comentário reflete com precisão como isso funciona.
  • Estaria faltando alguma coisa vê-lo como um cano? Troquei -prune por -print e acho que o fluxo está claro agora: encontre $ HOME | -path $ HOME / $ dir_name | -print

Resposta

Faz parte do comando find, a instrução -exec.

Ele permite que você interaja com o arquivo / diretório encontrado pelo comando find.

find $HOME -path $HOME/$dir_name -prune -o -name "*$file_suffix" -exec cp {} $HOME/$dir_name/ \;

find $HOME significa localizar arquivos / diretórios em $ HOME

Para entender -path <some_path>, consulte `find -path` explicado

Para entender -prune, consulte https://stackoverflow.com/questions/1489277/how-to-use-prune-option-of-find-in-sh

-o significa OU, então -path <some_path> OU -name *$file_suffix

-exec significa executar o comando.

cp {} $HOME/$dir_name/ copie quaisquer arquivos que correspondam a $HOME/$dir_name/

\; significa termine o -exec comando

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *