Explique as opções -path e -prune do find

3

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 deixar isso muito mais claro. Meu pensamento é que ele está funcionando como um loop, o arquivo encontrado atualmente é trocado por {} e copiado para $ HOME / $ dir_name, mas como é que a pesquisa com -path e -prune -o funciona? É chato ter 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 eu deveria ser capaz de descobrir isso.

-path pattern

File name matches shell pattern pattern. The metacharacters do not treat / or . specially; so, for example, find . -path "./sr*sc" will print an entry for a directory called ./src/misc (if one exists). To ignore a whole directory tree, use -prune rather than checking every file in the tree. For example, to skip the directory src/emacs and all files and directories under it, and print the names of the other files found, do something like this:

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

De manual do Findutils

-- Action: -exec command ; This insecure variant of the -execdir action is specified by POSIX. The main difference is that the command is executed in the directory from which find was invoked, meaning that {} is expanded to a relative path starting with the name of one of the starting directories, rather than just the basename of the matched file.

While some implementations of find replace the {} only where it appears on its own in an argument, GNU find replaces {} wherever it appears.

e

For example, to compare each C header file in or below the current directory with the file /tmp/master:

      find . -name '*.h' -execdir diff -u '{}' /tmp/master ';'
    
por trogdor 07.07.2017 / 22:30

2 respostas

7

-path funciona exatamente como -name , mas aplica o padrão ao nome do caminho inteiro do arquivo que está sendo examinado, em vez de ao último componente.

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

Colocando tudo junto, o comando

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

A idéia parece ser fazer um backup de parte do conteúdo de $HOME em um subdiretório de $HOME . As peças com -prune são obviamente necessárias para evitar backups de backups ...

    
por 07.07.2017 / 22:39
3

É 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 link

-o significa OR, portanto, -path <some_path> OU -name *$file_suffix

-exec significa executar o comando.

cp {} $HOME/$dir_name/ copie todos os arquivos correspondentes a $HOME/$dir_name/

\; significa terminar o comando -exec

    
por 07.07.2017 / 22:39

Tags