Listar todos los archivos en un dispositivo USB desde / Volumes Shell Script

0

Para aclarar las cosas, tengo acciones de carpeta de configuración en mi mac para que, siempre que se conecte un dispositivo USB a mi mac, se ejecute un script de shell.

Cuando enumero todos los archivos en el Directorio / Volúmenes que obtengo

$ ls -a
.       ..      .DS_Store   MobileBackups   Storage     WED

Lo que quiero hacer es enumerar todas las carpetas y archivos ubicados en WED o cualquier USB que aparezca, por lo tanto, excluyendo los directorios

.       ..      .DS_Store   MobileBackups   Storage

Dejándome con

WED

Lo que tengo para el script hasta ahora es:

GLOBIGNORE='/Volumes/MobileBackups*':'/Volumes/Storage*'
find '/Volumes' >> /Users/Brett/dev/USBLOGS/LogUSB.txt

He intentado varias formas diferentes pero todavía termina listando cada archivo en el directorio / Volumes.

Cualquier ayuda sería muy apreciada. Gracias, Brett

Además, es MAC OS X El Capitán

    
pregunta Brett Reinhard 12.01.2016 - 02:15

3 respuestas

3

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.

    
respondido por el user3439894 12.01.2016 - 06:42
1

Aquí hay una variación de la solución user3439894 sin configurar IFS o bucle.

system_profiler SPUSBDataType | awk -F": " '/Mount Point/ {printf("%s%c", $2, 0)}' | xargs -0 -IX find X >outfile

Los datos se analizan desde system_profiler con awk . awk imprime los puntos de montaje terminados con el carácter nulo que luego se canaliza a xargs y los resultados se escriben en outfile .

Para excluir archivos de puntos de la salida, ¡añada la opción! -nombre (no nombre) y! -ruta (no ruta) al comando de búsqueda.

system_profiler SPUSBDataType                       |
awk -F": " '/Mount Point/ {printf("%s%c", $2, 0)}'  |
xargs -0 -IX find X ! -name '.*'  ! -path 'X/.*/*' 2>/dev/null >outfile
    
respondido por el fd0 12.01.2016 - 22:07
0

Mi / Volúmenes dir:

 ➜  /Volumes  ls
BOOTCAMP      Cool Stuff    Macintosh HD  Recovery HD

Este comando enumera solo archivos en Recovery HD:

➜  /Volumes  find . -type d \( -name BOOTCAMP -o -name Cool\ Stuff \) -prune -o -print
.
./Macintosh HD
./Recovery HD
./Recovery HD/.fseventsd
./Recovery HD/.fseventsd/no_log
./Recovery HD/.metadata_never_index
./Recovery HD/.Trashes
find: ./Recovery HD/.Trashes: Permission denied
./Recovery HD/com.apple.boot.R
./Recovery HD/com.apple.boot.R/Library
...snip...

Puedes agregar más unidades a esa lista:

\( -name BOOTCAMP -o -name Cool\ Stuff -o -name Foo -o -name Bar -o -name Baz \)

Encontrado aquí: enlace

    
respondido por el chazlarson 12.01.2016 - 03:37

Lea otras preguntas en las etiquetas