Tengo un script simple que entiendo la mayor parte, es el comando de búsqueda que no está claro. Tengo mucha documentación pero no sirve para aclararla mucho. Mi pensamiento es que está funcionando como un bucle for, el archivo encontrado actualmente se intercambia por {} y se copia en $ HOME / $ dir_name, pero ¿cómo funciona la búsqueda con -path y -prune -o funciona? Es molesto tener 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 que sé que debería ser capaz de resolver esto desde.
-path pattern
El nombre del archivo coincide con el patrón de shell. Los metacaracteres no tratan a / o . especialmente; entonces, por ejemplo, busque. -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 todos los archivos del árbol. Por ejemplo, para omitir el directorio src / emacs y todos los archivos y directorios debajo de él, 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.
Si bien algunas implementaciones de buscar reemplazan el {} solo donde aparece por sí solo en un argumento, GNU find reemplaza {} dondequiera 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 ";"
Comentarios
- Posible duplicado de find: prune no ignora la ruta especificada
- Creo que, en todo caso, es ‘ un duplicado de explicación de la ruta de búsqueda incluso si la respuesta en find: prune no ignora la p especificada ath tiene una respuesta que parece aplicarse a esta pregunta. Quizás las respuestas find-path explicadas tengan sentido para alguien con más experiencia en la creación de scripts, pero no ‘ me ayudan. Las respuestas aquí presentes tienen más sentido para mí hasta ahora, aunque ‘ estoy empezando a investigarlas.
Respuesta
-path
funciona exactamente igual que -name
, pero aplica el patrón al nombre de ruta completo del archivo que se está examinando, en lugar del último componente.
-prune
prohíbe descender por debajo del archivo encontrado, en caso de que sea un directorio.
Poniéndolo todo junto, el comando
find $HOME -path $HOME/$dir_name -prune -o -name "*$file_suffix" -exec cp {} $HOME/$dir_name/ \;
- Empieza a buscar archivos en
$HOME
. - Si encuentra un archivo que coincida con
$HOME/$dir_name
no irá debajo («poda» el subdirectorio). - De lo contrario (
-o
) si encuentra un archivo que coincide con*$file_suffix
lo copia en$HOME/$dir_name/
.
La idea parece ser hacer una copia de seguridad de algunos de los contenidos de $HOME
en un subdirec historia de $HOME
. Las partes con -prune
son obviamente necesarias para evitar hacer copias de seguridad de las copias de seguridad …
Comentarios
- Si entiendo, entonces: find iterará a través de todos y cada uno de los directorios en $ HOME en los que tiene permisos para ingresar, excepto $ HOME / $ dir_name, al que no descenderá (porque la acción de podar se evaluará como verdadera y la o no se tomarán), buscando archivos que terminen con $ file_suffix. Luego, tan pronto como encuentre uno, ejecutará cp » found_file.sh » en $ HOME / $ dir_name? Además, -path permite una ruta a un archivo, ¿y es útil cuando desea que find descienda a directorios y no solo funcione en el directorio actual?
- Su comprensión es casi correcto.
-path
funciona igual que-name
: selecciona archivos. La diferencia es que-name
hace coincidir un patrón con el nombre del archivo, mientras que-path
hace coincidir un patrón con la ruta completa.find
siempre desciende a subdirectorios, a menos que lo impida-maxdepth
o-prune
, etc. - ¡Oh!-path se está aplicando a $ HOME / $ dir_name -prune entonces, es ‘ el orden de los comandos que me estaban arruinando, y -path es necesario para el comando podar porque debe coincidir con la ruta completa del directorio podado.
- @Darren I ‘ no estoy seguro de que ‘ es bastante preciso.
-path $HOME/$dir_name
es una acción. Es una prueba que verifica si la ruta del archivo actual que se está examinando coincide con lo que sea$HOME/$dir_name
.-prune
es una acción separada. Creo que la primera oración de su primer comentario refleja con precisión cómo funciona. - ¿Le faltaría algo para verlo como una tubería? Cambié -prune con -print y creo que el flujo es claro ahora: encuentra $ HOME | -ruta $ HOME / $ dir_name | -print
Respuesta
Es parte del comando de búsqueda, la instrucción -exec.
Le permite interactuar con el archivo / directorio encontrado por el comando find
.
find $HOME -path $HOME/$dir_name -prune -o -name "*$file_suffix" -exec cp {} $HOME/$dir_name/ \;
find $HOME
significa buscar archivos / directorios en $ HOME
Para comprender -path <some_path>
, consulte `find -path` explicado
Para comprender -prune
, consulte https://stackoverflow.com/questions/1489277/how-to-use-prune-option-of-find-in-sh
-o
significa OR, entonces -path <some_path>
O -name *$file_suffix
-exec
significa ejecutar el comando.
cp {} $HOME/$dir_name/
copia cualquier archivo que coincida con $HOME/$dir_name/
\;
significa terminar el -exec
comando