Elenca tutti i file nel dispositivo USB da / Volumes Shell Script

0

Per chiarire le cose ho azioni di cartella di installazione sul mio Mac per ogni volta che un dispositivo USB è collegato al mio mac verrà eseguito uno script di shell.

Quando elenco tutti i file nella directory / volumi che ottengo

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

Quello che voglio fare è elencare tutte le cartelle e i file che si trovano in WED o in qualsiasi USB che si apre, quindi escludendo le directory

.       ..      .DS_Store   MobileBackups   Storage

Lasciandomi con

WED

Quello che ho finora per lo script è:

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

Ho provato diversi modi, ma continua a elencare ogni singolo file nella directory / Volumes.

Qualsiasi aiuto sarebbe molto apprezzato. Grazie, Brett

Inoltre, è MAC OS X El Capitan

    
posta Brett Reinhard 12.01.2016 - 02:15
fonte

3 risposte

3

Poiché si desidera solo find per agire sui dispositivi di blocco USB, di seguito è riportato un esempio di utilizzo delle informazioni riportate da System Profiler per ottenere il punto di montaggio di qualsiasi dispositivo a blocchi USB collegato e montato. Facendolo in questo modo non importa quali altri punti di mount esistono sotto /Volumes né importa quale sia il nome del dispositivo di blocco USB poiché è determinato da System Profiler e non dal comando ls .

Ho modificato il codice, ancora una volta, rimuovendo la riga di comando composta in quanto non è probabile che verrebbe comunque eseguito in questo modo ed è più facile da mantenere in forma di script mentre aggiungo la possibilità di gestire gli spazi nel nome dell'etichetta del Dispositivo di blocco USB.

Modificando temporaneamente il Separatore di campo interno $IFS , aggiungendo IFS=$'\n' allo script ignorerai lo spazio (s) come separatore nell'output di grep quando viene passato a find . Per non rovinare alcun codice nel resto del tuo script, prima pugno lo stato di $IFS e poi lo ripongo.

In uno script 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"

La system_profiler SPUSBDataType restituisce informazioni sul bus USB e la canalizza attraverso grep per ottenere /Volumes/$whatever ad es. /Volumes/USB Drive usando -oE per '/Volumes/.*$' che restituisce /Volumes/ e tutto dopo di esso fino alla fine della riga, quindi '/Volumes/.*$' tradurrà il percorso completo del punto di montaggio di qualsiasi dispositivo a blocchi USB montato. Quindi, qualunque sia il dispositivo di blocco USB montato, è assegnato a $p (ho scelto "p" per percorso ) e quando è stato usato con find ho aggiunto /* dopo di esso così sarebbe non emette i dotfiles . Il blocco if è lì per evitare qualsiasi output se non sono montati dispositivi di blocco USB.

    
risposta data 12.01.2016 - 06:42
fonte
1

Ecco una variante della soluzione user3439894 senza impostare IFS o looping.

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

I dati vengono analizzati da system_profiler con awk . awk stampa i punti di montaggio terminati con il carattere null che viene quindi reindirizzato a xargs e i risultati vengono scritti su outfile .

Per escludere i file punto dall'output aggiungi l'opzione! -nome (non nome) e! -path (non percorso) al comando find.

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

My / Volumes dir:

 ➜  /Volumes  ls
BOOTCAMP      Cool Stuff    Macintosh HD  Recovery HD

Questo comando elenca solo i file su 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...

Puoi aggiungere più unità a quell'elenco:

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

Trovato qui: link

    
risposta data 12.01.2016 - 03:37
fonte

Leggi altre domande sui tag