Tengo una secuencia de comandos simple que entiendo, es el comando de búsqueda que no está claro. Tengo mucha documentación, pero no sirve para que sea mucho más claro. Creo que funciona como un bucle for, el archivo encontrado actualmente se intercambia por {} y se copia a $ HOME / $ dir_name, pero ¿cómo funciona la búsqueda con -path y -prune -o ? Es molesto tener una documentación tan específica y relevante y aún no saber qué está pasando.
#!/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 es solo la documentación de la que sé que debería poder resolver esto.
patrón de ruta
El nombre del archivo coincide con el patrón de concha. Los metacaracteres no tratan / o . especialmente; entonces, por ejemplo, encontrar. -path "./sr*sc" imprimirá una entrada para un directorio llamado ./src/misc (si existe). Para ignorar un árbol de directorios completo, use -prune en lugar de verificar cada archivo en el árbol. Por ejemplo, para omitir el directorio src / emacs y todos los archivos y directorios que contiene, e imprimir los nombres de los otros archivos encontrados, haga algo como esto:
find . -path ./src/emacs -prune -o -print
- Acción: comando -exec; POSIX especifica esta variante insegura de la acción -execdir . La principal diferencia es que el comando se ejecuta en el directorio desde el que se invocó find , lo que significa que {} se expande a una ruta relativa que comienza con el nombre de uno de los directorios de inicio, en lugar de solo el nombre base del archivo coincidente.
Mientras que algunas implementaciones de find reemplazan {} solo donde aparece solo en un argumento, GNU find reemplaza {} donde sea que aparezca.
Y
Por ejemplo, para comparar cada archivo de encabezado C en o debajo del directorio actual con el archivo / tmp / master:
find . -name '*.h' -execdir diff -u '{}' /tmp/master ';'