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
– 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/ \;
- Começa a procurar arquivos em
$HOME
. - Se encontrar um arquivo que corresponda a
$HOME/$dir_name
, ele não “irá abaixo dele (” removerá “o subdiretório). - 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