{"id":353763,"date":"2024-08-30T09:31:34","date_gmt":"2024-08-30T09:31:34","guid":{"rendered":"https:\/\/www.ninjaone.com\/script-hub\/comprobar-la-presencia-de-archivos-macos\/"},"modified":"2024-10-13T19:07:40","modified_gmt":"2024-10-13T19:07:40","slug":"comprobar-la-presencia-de-archivos-macos","status":"publish","type":"script_hub","link":"https:\/\/www.ninjaone.com\/es\/script-hub\/comprobar-la-presencia-de-archivos-macos\/","title":{"rendered":"C\u00f3mo comprobar la presencia de archivos y carpetas en macOS de forma automatizada"},"content":{"rendered":"<p>En el mundo inform\u00e1tico, la automatizaci\u00f3n de tareas repetitivas puede ahorrar tiempo y reducir errores. Una de estas tareas consiste en comprobar la presencia de archivos o carpetas espec\u00edficos en varios directorios. Ya sea para el cumplimiento de normativas, la supervisi\u00f3n del sistema o la soluci\u00f3n de problemas, disponer <strong>de una forma autom\u00e1tica de comprobar la presencia de archivos<\/strong> puede ser muy valioso para los profesionales de TI y los <a href=\"https:\/\/www.ninjaone.com\/es\/que-es-un-msp\" target=\"_blank\" rel=\"noopener\">proveedores de servicios gestionados (MSP)<\/a>. Este post explora un script Bash dise\u00f1ado para agilizar este proceso, garantizando la eficiencia y la fiabilidad en la gesti\u00f3n de archivos.<\/p>\n<h2>Background<\/h2>\n<p>Este script para comprobar la presencia de archivos es especialmente \u00fatil para los profesionales de TI que necesitan verificar la existencia de archivos o carpetas cr\u00edticos de forma regular. Proporciona una <a href=\"https:\/\/www.ninjaone.com\/es\/blog\/todo-sobre-automatizacion-de-ti\/\" target=\"_blank\" rel=\"noopener\">soluci\u00f3n automatizada<\/a> para buscar en directorios, asegur\u00e1ndose de comprobar la presencia de archivos importantes o identificando cu\u00e1ndo faltan. Esta capacidad es crucial en varios escenarios, como validar las ubicaciones de las copias de seguridad, garantizar la presencia de archivos de configuraci\u00f3n o confirmar el despliegue de aplicaciones cr\u00edticas.<\/p>\n<h2>El script para comprobar la presencia de archivos<\/h2>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\">#!\/usr\/bin\/env bash\r\n\r\n# Description: Alert if a specified file or folder is found in a directory or subdirectory you specify.\r\n#\r\n# Release Notes: Initial Release\r\n# By using this script, you indicate your acceptance of the following legal terms as well as our Terms of Use at https:\/\/www.ninjaone.com\/terms-of-use.\r\n# Ownership Rights: NinjaOne owns and will continue to own all right, title, and interest in and to the script (including the copyright). NinjaOne is giving you a limited license to use the script in accordance with these legal terms. \r\n# Use Limitation: You may only use the script for your legitimate personal or internal business purposes, and you may not share the script with another party. \r\n# Republication Prohibition: Under no circumstances are you permitted to re-publish the script in any script library or website belonging to or under the control of any other software provider. \r\n# Warranty Disclaimer: The script is provided \u201cas is\u201d and \u201cas available\u201d, without warranty of any kind. NinjaOne makes no promise or guarantee that the script will be free from defects or that it will meet your specific needs or expectations. \r\n# Assumption of Risk: Your use of the script is at your own risk. You acknowledge that there are certain inherent risks in using the script, and you understand and assume each of those risks. \r\n# Waiver and Release: You will not hold NinjaOne responsible for any adverse or unintended consequences resulting from your use of the script, and you waive any legal or equitable rights or remedies you may have against NinjaOne relating to your use of the script. \r\n# EULA: If you are a NinjaOne customer, your use of the script is subject to the End User License Agreement applicable to you (EULA).\r\n#\r\n# Below are all the (case sensitive) valid parameters for this script.\r\n# Only the path to search and name of file or folder are required!\r\n#\r\n# Parameter: --path \"\/opt\/NinjaRMM\/programdata\"\r\n#   Required\r\n#   Base path to search for files or folders.\r\n#\r\n# Parameter: --name \"ninjarmm-cli\"\r\n#   Required\r\n#   Name of the file or folder to search for.\r\n#   Notes:\r\n#       If the name is not provided, the script will search for the path only.\r\n#       This is case sensitive and accepts wildcards.\r\n#\r\n# Parameter: --type \"Files Or Folders\"\r\n#   Required\r\n#   Search for files or folders.\r\n#\r\n# Parameter: --type \"Files Only\"\r\n#   Required\r\n#   Searches for files only.\r\n#\r\n# Parameter: --type \"Folders Only\"\r\n#   Required\r\n#   Searches for folder only.\r\n#\r\n# Parameter: --timeout 10\r\n#   Optional and defaults to 30 minutes\r\n#   Time in minutes to wait for the search to complete before timing out.\r\n#\r\n# Parameter: --customfield \"myCustomField\"\r\n#   Optional\r\n#   Custom Field to save the search results to.\r\n\r\ndie() {\r\n    local _ret=\"${2:-1}\"\r\n    test \"${_PRINT_HELP:-no}\" = yes &amp;&amp; print_help &gt;&amp;2\r\n    echo \"$1\" &gt;&amp;2\r\n    exit \"${_ret}\"\r\n}\r\n\r\nbegins_with_short_option() {\r\n    local first_option all_short_options='h'\r\n    first_option=\"${1:0:1}\"\r\n    test \"$all_short_options\" = \"${all_short_options\/$first_option\/}\" &amp;&amp; return 1 || return 0\r\n}\r\n\r\n# Initize arguments\r\n_arg_path=\r\n_arg_name=\r\n_arg_type=\r\n_arg_timeout=30\r\n_arg_customfield=\r\n\r\nprint_help() {\r\n    printf '%s\\n' \"Check existence of a file or folder\"\r\n    printf 'Usage: %s [--path &lt;arg&gt;] [--name &lt;arg&gt;] [--type &lt;\"Files Only\"|\"Folders Only\"|\"Files Or Folders\"&gt;] [--timeout &lt;30&gt;] [--customfield &lt;arg&gt;] [-h|--help]\\n' \"$0\"\r\n    printf '\\t%s\\n' \"-h, --help: Prints help\"\r\n}\r\n\r\nparse_commandline() {\r\n    while test $# -gt 0; do\r\n        _key=\"$1\"\r\n        case \"$_key\" in\r\n        --path)\r\n            test $# -lt 2 &amp;&amp; die \"Missing value for the optional argument '$_key'.\" 1\r\n            _arg_path=\"$2\"\r\n            shift\r\n            ;;\r\n        --path=*)\r\n            _arg_path=\"${_key##--path=}\"\r\n            ;;\r\n        --name)\r\n            test $# -lt 2 &amp;&amp; die \"Missing value for the optional argument '$_key'.\" 1\r\n            _arg_name=\"$2\"\r\n            shift\r\n            ;;\r\n        --name=*)\r\n            _arg_name=\"${_key##--name=}\"\r\n            ;;\r\n        --type)\r\n            test $# -lt 2 &amp;&amp; die \"Missing value for the optional argument '$_key'.\" 1\r\n            _arg_type=\"$2\"\r\n            shift\r\n            ;;\r\n        --type=*)\r\n            _arg_type=\"${_key##--type=}\"\r\n            ;;\r\n        --timeout)\r\n            test $# -lt 2 &amp;&amp; die \"Missing value for the optional argument '$_key'.\" 1\r\n            _arg_timeout=\"$2\"\r\n            shift\r\n            ;;\r\n        --timeout=*)\r\n            _arg_timeout=\"${_key##--timeout=}\"\r\n            ;;\r\n        --customfield)\r\n            test $# -lt 2 &amp;&amp; die \"Missing value for the optional argument '$_key'.\" 1\r\n            _arg_customfield=\"$2\"\r\n            shift\r\n            ;;\r\n        --customfield=*)\r\n            _arg_customfield=\"${_key##--customfield=}\"\r\n            ;;\r\n        -h | --help)\r\n            print_help\r\n            exit 0\r\n            ;;\r\n        -h*)\r\n            print_help\r\n            exit 0\r\n            ;;\r\n        *)\r\n            _PRINT_HELP=yes die \"FATAL ERROR: Got an unexpected argument '$1'\" 1\r\n            ;;\r\n        esac\r\n        shift\r\n    done\r\n}\r\n\r\nparse_commandline \"$@\"\r\n\r\nfunction SetCustomField() {\r\n    customfieldName=$1\r\n    customfieldValue=$2\r\n    if [ -f \"${NINJA_DATA_PATH}\/ninjarmm-cli\" ]; then\r\n        if [ -x \"${NINJA_DATA_PATH}\/ninjarmm-cli\" ]; then\r\n            if \"$NINJA_DATA_PATH\"\/ninjarmm-cli get \"$customfieldName\" &gt;\/dev\/null; then\r\n                # check if the value is greater than 10000 characters\r\n                if [ ${#customfieldValue} -gt 10000 ]; then\r\n                    echo \"[Warn] Custom field value is greater than 10000 characters\"\r\n                fi\r\n                if ! echo \"${customfieldValue::10000}\" | \"$NINJA_DATA_PATH\"\/ninjarmm-cli set --stdin \"$customfieldName\"; then\r\n                    echo \"[Warn] Failed to set custom field\"\r\n                else\r\n                    echo \"[Info] Custom field value set successfully\"\r\n                fi\r\n            else\r\n                echo \"[Warn] Custom Field ($customfieldName) does not exist or agent does not have permission to access it\"\r\n            fi\r\n        else\r\n            echo \"[Warn] ninjarmm-cli is not executable\"\r\n        fi\r\n    else\r\n        echo \"[Warn] ninjarmm-cli does not exist\"\r\n    fi\r\n}\r\n\r\nif [ ! \"$(command -v timeout)\" ]; then\r\n    notimeout=true\r\n    # If the timeout command does not exist, create a function to mimic the timeout command\r\n    function timeout() { perl -e 'alarm shift; exec @ARGV' \"$@\"; }\r\nfi\r\n\r\nparentSearchPath=$_arg_path\r\nleafSearchName=$_arg_name\r\nsearchType=$_arg_type\r\ntimeout=$_arg_timeout\r\ncustomField=$_arg_customfield\r\n\r\n# Get values from Script Variables\r\nif [[ -n \"${pathToSearch}\" ]]; then\r\n    parentSearchPath=\"${pathToSearch}\"\r\nfi\r\nif [[ -n \"${nameOfFileOrFolder}\" ]]; then\r\n    leafSearchName=\"${nameOfFileOrFolder}\"\r\nfi\r\nif [[ -n \"${filesOrFolders}\" &amp;&amp; \"${filesOrFolders}\" != \"null\" ]]; then\r\n    searchType=\"${filesOrFolders}\"\r\nfi\r\nif [[ -n \"${searchTimeout}\" &amp;&amp; \"${searchTimeout}\" != \"null\" ]]; then\r\n    timeout=\"${searchTimeout}\"\r\nfi\r\nif [[ -n \"${customFieldName}\" &amp;&amp; \"${customFieldName}\" != \"null\" ]]; then\r\n    customField=\"${customFieldName}\"\r\nfi\r\n\r\n# Check if parentSearchPath is a link and replace it with the resolved path\r\nif [ -L \"${parentSearchPath}\" ]; then\r\n    echo \"[Info] Path to Search is a link: ${parentSearchPath} -&gt; $(readlink -f \"${parentSearchPath}\")\"\r\n    echo \"[Info] Will use the resolved path to search\"\r\n    parentSearchPath=$(readlink -f \"${parentSearchPath}\")\r\nfi\r\n\r\nif [[ -z \"${parentSearchPath}\" ]]; then\r\n    echo \"[Error] Path to Search is empty\"\r\n    exit 1\r\nfi\r\n\r\n# Check if path exists\r\nif [ -e \"${parentSearchPath}\" ]; then\r\n    echo \"[Info] Path ${parentSearchPath} exists\"\r\nelse\r\n    echo \"[Error] Path to Search ${parentSearchPath} does not exist or is an invalid path\"\r\n    exit 1\r\nfi\r\n\r\n# Check if timeout is a number\r\nif ! [[ \"${timeout}\" =~ ^[0-9]+$ ]]; then\r\n    echo \"[Error] Timeout is not a number\"\r\n    exit 1\r\nfi\r\n# Check if timeout is not in the range of 1 to 120\r\nif [[ \"${timeout}\" -lt 1 || \"${timeout}\" -gt 120 ]]; then\r\n    echo \"[Error] Timeout is not in the range of 1 to 120\"\r\n    exit 1\r\nfi\r\n\r\n# Check if search type is valid\r\n\r\nif $notimeout; then\r\n    # If the timeout command does not exist, convert the timeout to minutes\r\n    timeout=$((timeout * 60))\r\nelse\r\n    # If the timeout command does exist, add m to the end of the string\r\n    timeout=\"${timeout}m\"\r\nfi\r\n\r\nif [[ $OSTYPE == 'darwin'* ]]; then\r\n    if ! plutil -lint \/Library\/Preferences\/com.apple.TimeMachine.plist &gt;\/dev\/null; then\r\n        echo \"This script requires ninjarmm-macagent to have Full Disk Access.\"\r\n        echo \"Add ninjarmm-macagent to the Full Disk Access list in System Preferences &gt; Security &amp; Privacy, quit the app, and re-run this script.\"\r\n        exit 1\r\n    fi\r\nfi\r\n\r\n# Search for files or folders\r\nif [[ -n \"${leafSearchName}\" &amp;&amp; \"${leafSearchName}\" != \"null\" ]]; then\r\n    if [[ \"${searchType}\" == *\"Files\"* &amp;&amp; \"${searchType}\" == *\"Only\"* ]]; then\r\n        echo \"[Info] Searching for files only\"\r\n        # Search for files only\r\n        # Use timeout to prevent the find command from running indefinitely\r\n        foundPath=$(timeout \"${timeout}\" find \"$parentSearchPath\" -type f -name \"$leafSearchName\" 2&gt;\/dev\/null)\r\n        exitcode=$?\r\n        if [[ $exitcode -eq 0 || $exitcode -eq 124 ]]; then\r\n            if [[ -n $foundPath ]]; then\r\n                echo \"[Alert] File Found\"\r\n            fi\r\n        fi\r\n    elif [[ \"${searchType}\" == *\"Folders\"* &amp;&amp; \"${searchType}\" == *\"Only\"* ]]; then\r\n        echo \"[Info] Searching for folders only\"\r\n        # Search for folders only\r\n        # Use timeout to prevent the find command from running indefinitely\r\n        foundPath=$(timeout \"${timeout}\" find \"$parentSearchPath\" -type d -name \"$leafSearchName\" 2&gt;\/dev\/null)\r\n        exitcode=$?\r\n        if [[ $exitcode -eq 0 || $exitcode -eq 124 ]]; then\r\n            if [[ -n $foundPath ]]; then\r\n                echo \"[Alert] File Found\"\r\n            fi\r\n        fi\r\n    elif [[ \"${searchType}\" == *\"Files\"* &amp;&amp; \"${searchType}\" == *\"Folders\"* ]]; then\r\n        echo \"[Info] Searching for files or folders\"\r\n        # Search for files or folders\r\n        # Use timeout to prevent the find command from running indefinitely\r\n        foundPath=$(timeout \"${timeout}\" find \"$parentSearchPath\" -name \"$leafSearchName\" 2&gt;\/dev\/null)\r\n        exitcode=$?\r\n        if [[ $exitcode -eq 0 || $exitcode -eq 124 ]]; then\r\n            if [[ -n $foundPath ]]; then\r\n                echo \"[Alert] File Found\"\r\n            fi\r\n        fi\r\n    else\r\n        echo \"[Error] Invalid search type\"\r\n        echo \"Valid search types: Files Only, Folders Only, Files Or Folders\"\r\n        exit 1\r\n    fi\r\nelif [[ -z \"${leafSearchName}\" ]]; then\r\n    echo \"[Info] Searching in path only\"\r\n    # Search in path only\r\n    # Use timeout to prevent the find command from running indefinitely\r\n    foundPath=$(timeout \"${timeout}\" find \"$parentSearchPath\")\r\n    exitcode=$?\r\n    if [[ $exitcode -eq 0 || $exitcode -eq 124 ]]; then\r\n        if [[ -n $foundPath ]]; then\r\n            echo \"[Alert] File Found\"\r\n        fi\r\n    fi\r\nfi\r\n\r\n# Check exit code\r\nif [[ -n $foundPath ]]; then\r\n    # Split the string into an array\r\n    IFS=$'\\n' read -rd '' -a foundPathArray &lt;&lt;&lt;\"${foundPath}\"\r\n    # Print each element of the array\r\n    for element in \"${foundPathArray[@]}\"; do\r\n        echo \"[Alert] ${element} exists\"\r\n    done\r\nelif [[ -z $foundPath ]]; then\r\n    echo \"[Warn] Could not find a file or folder\"\r\n    exit 1\r\nelse\r\n    # If the find command fails to find the file or folder\r\n\r\n    # Figure out the grammer for the search type\r\n    if [[ \"${searchType}\" == *\"Only\"* ]]; then\r\n        if [[ \"${searchType}\" == *\"Files\"* ]]; then\r\n            searchTypeInfo=\"file\"\r\n        elif [[ \"${searchType}\" == *\"Folders\"* ]]; then\r\n            searchTypeInfo=\"folder\"\r\n        fi\r\n    elif [[ \"${searchType}\" == *\"Files\"* &amp;&amp; \"${searchType}\" == *\"Folders\"* ]]; then\r\n        searchTypeInfo=\"file or folder\"\r\n    fi\r\n    echo \"[Info] Could not find a ${searchTypeInfo} in the path ${parentSearchPath} with the name containing: ${leafSearchName}\"\r\nfi\r\n\r\n# If foundPath contains \"Alarm clock:\" then the command timed out\r\nif [[ \"${foundPath}\" == *\"Alarm clock:\"* ]]; then\r\n    echo \"[Alert] Timed out searching for file or folder\"\r\n    # Remove \"Alarm clock: *\" from the string\r\n    foundPath=${foundPath\/Alarm clock: [0-9]*\/\/}\r\nfi\r\n\r\n# If command times out\r\nif [[ $exitcode -ge 124 &amp;&amp; $exitcode -le 127 || $exitcode -eq 137 ]]; then\r\n    echo \"[Alert] Timed out searching for file or folder\"\r\n    echo \"timeout exit code: $exitcode\"\r\n    echo \"  124  if COMMAND times out, and --preserve-status is not specified\"\r\n    echo \"  125  if the timeout command itself fails\"\r\n    echo \"  126  if COMMAND is found but cannot be invoked\"\r\n    echo \"  127  if COMMAND cannot be found\"\r\n    echo \"  137  if COMMAND (or timeout itself) is sent the KILL (9) signal (128+9)\"\r\n    echo \"find command result: $foundPath\"\r\n    exit 1\r\nfi\r\n\r\n# Save to custom field\r\nif [[ -n \"${customField}\" &amp;&amp; \"${customField}\" != \"null\" ]]; then\r\n    SetCustomField \"${customField}\" \"${foundPath}\"\r\nfi<\/pre>\n<p>&nbsp;<\/p>\n\n<div class=\"blog-cta-new blog-cta-style-1\"><div class=\"cta-left\"><h2><\/h2><p><\/p><\/div><div class=\"cta-right\"><a class=\"button\" href=\"\"><\/a><\/div><\/div>\n<h2>An\u00e1lisis detallado<\/h2>\n<p>El script para comprobar la presencia de archivos funciona tomando varios par\u00e1metros para personalizar el proceso de b\u00fasqueda. Aqu\u00ed tienes un desglose detallado de su funcionalidad:<\/p>\n<p><strong>1. Par\u00e1metros e inicializaci\u00f3n<\/strong>:<\/p>\n<ul>\n<li data-leveltext=\"\uf0b7\" data-font=\"Symbol\" data-listid=\"2\" data-list-defn-props=\"{&quot;335552541&quot;:1,&quot;335559685&quot;:1440,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;\uf0b7&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}\" data-aria-posinset=\"1\" data-aria-level=\"2\"><strong>&#8211;path<\/strong>: Especifica el directorio base en el que buscar.<\/li>\n<\/ul>\n<ul>\n<li data-leveltext=\"\uf0b7\" data-font=\"Symbol\" data-listid=\"2\" data-list-defn-props=\"{&quot;335552541&quot;:1,&quot;335559685&quot;:1440,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;\uf0b7&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}\" data-aria-posinset=\"2\" data-aria-level=\"2\"><strong>&#8211;name<\/strong>: Define el nombre del archivo o carpeta a buscar, admitiendo comodines.<\/li>\n<\/ul>\n<ul>\n<li data-leveltext=\"\uf0b7\" data-font=\"Symbol\" data-listid=\"2\" data-list-defn-props=\"{&quot;335552541&quot;:1,&quot;335559685&quot;:1440,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;\uf0b7&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}\" data-aria-posinset=\"3\" data-aria-level=\"2\"><strong>&#8211;type<\/strong>: Determina si se buscan archivos, carpetas o ambos.<\/li>\n<\/ul>\n<ul>\n<li data-leveltext=\"\uf0b7\" data-font=\"Symbol\" data-listid=\"2\" data-list-defn-props=\"{&quot;335552541&quot;:1,&quot;335559685&quot;:1440,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;\uf0b7&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}\" data-aria-posinset=\"4\" data-aria-level=\"2\"><strong>&#8211;timeout<\/strong>: Establece el tiempo m\u00e1ximo para la operaci\u00f3n de b\u00fasqueda, por defecto 30 minutos.<\/li>\n<\/ul>\n<ul>\n<li data-leveltext=\"\uf0b7\" data-font=\"Symbol\" data-listid=\"2\" data-list-defn-props=\"{&quot;335552541&quot;:1,&quot;335559685&quot;:1440,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;\uf0b7&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}\" data-aria-posinset=\"5\" data-aria-level=\"2\"><strong>&#8211;customfield<\/strong>: Permite guardar el resultado de la b\u00fasqueda en un campo personalizado.<\/li>\n<\/ul>\n<p><strong>2. An\u00e1lisis de argumentos<\/strong>: El script para comprobar la presencia de archivos analiza los argumentos de la l\u00ednea de comandos para inicializar los par\u00e1metros de b\u00fasqueda. Si falta alg\u00fan par\u00e1metro requerido, proporciona un mensaje de error y sale.<\/p>\n<p><strong>3. Ejecuci\u00f3n de la b\u00fasqueda<\/strong>:<\/p>\n<ul>\n<li data-leveltext=\"\uf0b7\" data-font=\"Symbol\" data-listid=\"2\" data-list-defn-props=\"{&quot;335552541&quot;:1,&quot;335559685&quot;:1440,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;\uf0b7&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}\" data-aria-posinset=\"6\" data-aria-level=\"2\">El script para comprobar la presencia de archivos resuelve cualquier enlace simb\u00f3lico en la ruta de b\u00fasqueda.<\/li>\n<\/ul>\n<ul>\n<li data-leveltext=\"\uf0b7\" data-font=\"Symbol\" data-listid=\"2\" data-list-defn-props=\"{&quot;335552541&quot;:1,&quot;335559685&quot;:1440,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;\uf0b7&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}\" data-aria-posinset=\"7\" data-aria-level=\"2\">Verifica que la ruta especificada existe y es v\u00e1lida.<\/li>\n<\/ul>\n<ul>\n<li data-leveltext=\"\uf0b7\" data-font=\"Symbol\" data-listid=\"2\" data-list-defn-props=\"{&quot;335552541&quot;:1,&quot;335559685&quot;:1440,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;\uf0b7&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}\" data-aria-posinset=\"8\" data-aria-level=\"2\">Garantiza que el tiempo de espera est\u00e1 dentro del rango aceptable (de 1 a 120 minutos).<\/li>\n<\/ul>\n<p><strong>4. B\u00fasqueda de archivos o carpetas<\/strong>: Dependiendo del tipo especificado (archivos, carpetas o ambos), el script para comprobar la presencia de archivos utiliza el comando find con un tiempo de espera para localizar los elementos deseados. Si se encuentra, avisa al usuario y, opcionalmente, guarda el resultado en un campo personalizado.<\/p>\n<p><strong>5. Tratamiento de errores e informes<\/strong>: El script para comprobar la presencia de archivos incluye un completo tratamiento de errores, garantizando que problemas como rutas no v\u00e1lidas, valores de tiempo de espera incorrectos o archivos\/carpetas inexistentes se comuniquen claramente al usuario.<\/p>\n<h2>Posibles casos de uso<\/h2>\n<h3>Estudio de caso: Verificaci\u00f3n de la conformidad inform\u00e1tica<\/h3>\n<p>Un profesional de TI es responsable de garantizar que los archivos de configuraci\u00f3n de seguridad cr\u00edticos est\u00e9n presentes en todos los servidores. Con este script para comprobar la presencia de archivos y carpetas, puede automatizar el proceso de verificaci\u00f3n:<\/p>\n<p><strong>1. Configuraci\u00f3n<\/strong>:<\/p>\n<ul>\n<li data-leveltext=\"\uf0b7\" data-font=\"Symbol\" data-listid=\"2\" data-list-defn-props=\"{&quot;335552541&quot;:1,&quot;335559685&quot;:1440,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;\uf0b7&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}\" data-aria-posinset=\"9\" data-aria-level=\"2\"><strong>&#8211;path<\/strong>: \/etc\/security<\/li>\n<\/ul>\n<ul>\n<li data-leveltext=\"\uf0b7\" data-font=\"Symbol\" data-listid=\"2\" data-list-defn-props=\"{&quot;335552541&quot;:1,&quot;335559685&quot;:1440,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;\uf0b7&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}\" data-aria-posinset=\"10\" data-aria-level=\"2\"><strong>&#8211;name<\/strong>: security.conf<\/li>\n<\/ul>\n<ul>\n<li data-leveltext=\"\uf0b7\" data-font=\"Symbol\" data-listid=\"2\" data-list-defn-props=\"{&quot;335552541&quot;:1,&quot;335559685&quot;:1440,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;\uf0b7&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}\" data-aria-posinset=\"11\" data-aria-level=\"2\"><strong>&#8211;type<\/strong>: S\u00f3lo archivos<\/li>\n<\/ul>\n<ul>\n<li data-leveltext=\"\uf0b7\" data-font=\"Symbol\" data-listid=\"2\" data-list-defn-props=\"{&quot;335552541&quot;:1,&quot;335559685&quot;:1440,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;\uf0b7&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}\" data-aria-posinset=\"12\" data-aria-level=\"2\"><strong>&#8211;timeout<\/strong>: 10<\/li>\n<\/ul>\n<p><strong>2. Ejecuci\u00f3n<\/strong>: El script para comprobar la presencia de archivos y carpetas busca el archivo security.conf en la ruta especificada dentro del periodo de tiempo establecido. Si se encuentra, registra una alerta; si no, notifica al profesional de TI, lo que permite una r\u00e1pida remediaci\u00f3n.<\/p>\n<h2>Comparaciones<\/h2>\n<p>En comparaci\u00f3n con la verificaci\u00f3n manual o el uso de comandos b\u00e1sicos del shell, este script para comprobar la presencia de carpetas ofrece varias ventajas:<\/p>\n<ul>\n<li data-leveltext=\"\uf0b7\" data-font=\"Symbol\" data-listid=\"2\" data-list-defn-props=\"{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;\uf0b7&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}\" data-aria-posinset=\"2\" data-aria-level=\"1\"><strong>Automatizaci\u00f3n<\/strong>: Reduce la necesidad de controles manuales.<\/li>\n<\/ul>\n<ul>\n<li data-leveltext=\"\uf0b7\" data-font=\"Symbol\" data-listid=\"2\" data-list-defn-props=\"{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;\uf0b7&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}\" data-aria-posinset=\"3\" data-aria-level=\"1\"><strong>Gesti\u00f3n del tiempo de espera<\/strong>: Evita b\u00fasquedas prolongadas imponiendo un tiempo de espera.<\/li>\n<\/ul>\n<ul>\n<li data-leveltext=\"\uf0b7\" data-font=\"Symbol\" data-listid=\"2\" data-list-defn-props=\"{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;\uf0b7&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}\" data-aria-posinset=\"4\" data-aria-level=\"1\"><strong>Informes personalizados<\/strong>: Permite guardar los resultados en campos personalizados para su posterior procesamiento o para la elaboraci\u00f3n de informes de cumplimiento.<\/li>\n<\/ul>\n<p>Otros m\u00e9todos, como el uso de ls o comandos de prueba en Bash, carecen de estas caracter\u00edsticas avanzadas, por lo que este script para comprobar la presencia de archivos es una soluci\u00f3n m\u00e1s robusta y eficiente.<\/p>\n<h2>FAQ<\/h2>\n<ol>\n<li><strong>\u00bfQu\u00e9 ocurre si se agota el tiempo de espera del script para comprobar la presencia de archivos?<\/strong><br \/>\nEl script informa de un tiempo de espera y sale con un c\u00f3digo de error apropiado, asegur\u00e1ndose de que el usuario es consciente de que la b\u00fasqueda estaba incompleta.<\/li>\n<li><strong>\u00bfPuedo buscar varios tipos de archivos simult\u00e1neamente?<\/strong><br \/>\nNo, actualmente el script para comprobar la presencia de archivos permite buscar archivos o carpetas bas\u00e1ndose en un \u00fanico patr\u00f3n de nombre cada vez.<\/li>\n<li><strong>\u00bfC\u00f3mo se gestionan los enlaces simb\u00f3licos en la ruta de b\u00fasqueda?<\/strong><br \/>\nEl script para comprobar la presencia de archivos resuelve autom\u00e1ticamente los enlaces simb\u00f3licos, asegurando que la b\u00fasqueda se realiza en el directorio correcto.<\/li>\n<\/ol>\n<h2>Implicaciones<\/h2>\n<p>El uso de este script para comprobar la presencia de archivos puede mejorar significativamente la seguridad inform\u00e1tica al garantizar la presencia de archivos y carpetas cr\u00edticos. La verificaci\u00f3n automatizada ayuda a mantener el cumplimiento de las pol\u00edticas de seguridad y reduce el riesgo de omitir archivos importantes, lo que podr\u00eda provocar vulnerabilidades o fallos en el sistema.<\/p>\n<h2>Recomendaciones<\/h2>\n<ul>\n<li data-leveltext=\"\uf0b7\" data-font=\"Symbol\" data-listid=\"2\" data-list-defn-props=\"{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;\uf0b7&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}\" data-aria-posinset=\"5\" data-aria-level=\"1\"><strong>Realiza auditor\u00edas de forma peri\u00f3dica<\/strong>: Programa la ejecuci\u00f3n peri\u00f3dica del script para mantener actualizada la verificaci\u00f3n de los archivos cr\u00edticos.<\/li>\n<\/ul>\n<ul>\n<li data-leveltext=\"\uf0b7\" data-font=\"Symbol\" data-listid=\"2\" data-list-defn-props=\"{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;\uf0b7&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}\" data-aria-posinset=\"6\" data-aria-level=\"1\"><strong>Utiliza campos personalizados<\/strong>: Aprovecha la opci\u00f3n de campos personalizados para realizar un seguimiento e informar sistem\u00e1ticamente de los resultados de b\u00fasqueda.<\/li>\n<\/ul>\n<ul>\n<li data-leveltext=\"\uf0b7\" data-font=\"Symbol\" data-listid=\"2\" data-list-defn-props=\"{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;\uf0b7&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}\" data-aria-posinset=\"7\" data-aria-level=\"1\"><strong>Ajusta el tiempo de espera<\/strong>: Ajusta el par\u00e1metro de tiempo de espera en funci\u00f3n del tama\u00f1o previsto del directorio y del rendimiento del sistema para evitar retrasos innecesarios.<\/li>\n<\/ul>\n<h2>Reflexiones finales<\/h2>\n<p>Este script Bash es una potente herramienta para los profesionales de TI, ya que proporciona un m\u00e9todo automatizado y fiable para comprobar la presencia de archivos y carpetas. Al integrar este script para comprobar la presencia de archivos en las comprobaciones rutinarias, los MSP pueden garantizar una mayor <a href=\"https:\/\/www.ninjaone.com\/es\/eficiencia\/\" target=\"_blank\" rel=\"noopener\">eficacia<\/a> y <a href=\"https:\/\/www.ninjaone.com\/es\/?page_id=310645\" target=\"_blank\" rel=\"noopener\">seguridad<\/a> en sus operaciones. Herramientas como <a href=\"https:\/\/www.ninjaone.com\/es\/\" target=\"_blank\" rel=\"noopener\">NinjaOne<\/a> pueden mejorar a\u00fan m\u00e1s este proceso al ofrecer soluciones integrales de gesti\u00f3n de TI, lo que facilita la implementaci\u00f3n, supervisi\u00f3n y gesti\u00f3n de scripts en m\u00faltiples sistemas.<\/p>\n<p>La automatizaci\u00f3n de la gesti\u00f3n de archivos no s\u00f3lo ahorra tiempo, sino que tambi\u00e9n aumenta la precisi\u00f3n, garantizando que los archivos cr\u00edticos est\u00e9n siempre donde tienen que estar.<\/p>\n","protected":false},"author":35,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"_relevanssi_hide_post":"","_relevanssi_hide_content":"","_relevanssi_pin_for_all":"","_relevanssi_pin_keywords":"","_relevanssi_unpin_keywords":"","_relevanssi_related_keywords":"","_relevanssi_related_include_ids":"","_relevanssi_related_exclude_ids":"","_relevanssi_related_no_append":"","_relevanssi_related_not_related":"","_relevanssi_related_posts":"","_relevanssi_noindex_reason":"","_lmt_disableupdate":"","_lmt_disable":""},"operating_system":[4210],"use_cases":[4263],"class_list":["post-353763","script_hub","type-script_hub","status-publish","hentry","script_hub_category-macos"],"acf":[],"_links":{"self":[{"href":"https:\/\/www.ninjaone.com\/es\/wp-json\/wp\/v2\/script_hub\/353763","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.ninjaone.com\/es\/wp-json\/wp\/v2\/script_hub"}],"about":[{"href":"https:\/\/www.ninjaone.com\/es\/wp-json\/wp\/v2\/types\/script_hub"}],"author":[{"embeddable":true,"href":"https:\/\/www.ninjaone.com\/es\/wp-json\/wp\/v2\/users\/35"}],"replies":[{"embeddable":true,"href":"https:\/\/www.ninjaone.com\/es\/wp-json\/wp\/v2\/comments?post=353763"}],"wp:attachment":[{"href":"https:\/\/www.ninjaone.com\/es\/wp-json\/wp\/v2\/media?parent=353763"}],"wp:term":[{"taxonomy":"script_hub_category","embeddable":true,"href":"https:\/\/www.ninjaone.com\/es\/wp-json\/wp\/v2\/operating_system?post=353763"},{"taxonomy":"use_cases","embeddable":true,"href":"https:\/\/www.ninjaone.com\/es\/wp-json\/wp\/v2\/use_cases?post=353763"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}