Dado que solo desea que find
actúe en los dispositivos de bloqueo USB, el siguiente es un ejemplo del uso de la información que reporta el Perfil del Sistema para obtener el Punto de Montaje de cualquier dispositivo de bloqueo USB conectado y montado. Al hacerlo de esta manera, no importa qué otros puntos de montaje existan en /Volumes
ni importa cuál sea el nombre del dispositivo de bloqueo USB, ya que se determina a partir del Perfil del sistema, no el comando ls
.
Una vez más, he modificado el código, eliminando la línea de comandos compuesta, ya que no es probable que se ejecute de esa manera y es más fácil de mantener en forma de script mientras se agrega la capacidad de manejar espacios en el nombre de la etiqueta de Dispositivo de bloqueo USB.
Al cambiar temporalmente el Separador de campo interno $IFS
, agregar IFS=$'\n'
al script ignorará el espacio (s) como separador en la salida de grep
cuando se pasa a find
. Para no desordenar con ningún código en el resto de su script, primero obtengo el estado de $IFS
y luego lo reposo.
En un script de bash:
#!/bin/bash
_ifs="$IFS"
IFS=$'\n'
for p in $(system_profiler SPUSBDataType | grep -oE '/Volumes/.*$'); do
if [ -n "$p" ]; then
find "$p"/*
fi
done >> filename.txt
IFS="$_ifs"
system_profiler SPUSBDataType
genera información en el bus USB y la canaliza a través de grep
para obtener /Volumes/$whatever
e.g. /Volumes/USB Drive
usando -oE
para el '/Volumes/.*$'
que genera /Volumes/
y todo lo que le sigue hasta el final de la línea, por lo tanto, '/Volumes/.*$'
traducirá la ruta de acceso completa del punto de montaje de cualquier dispositivo de bloqueo USB montado. Entonces, sea cual sea el dispositivo de bloqueo USB que se monta, se asigna a $p
(elegí "p" para ruta ) y cuando se usa con find
agregué /*
después de eso, así que no muestra los archivos de puntos . El bloque if
está ahí para evitar cualquier salida si no hay dispositivos de bloqueo USB montados.