Répertorier tous les fichiers du périphérique USB depuis / Volumes Shell Script

0

Pour clarifier les choses, j'ai des actions de dossier de configuration sur mon Mac car chaque fois qu'un périphérique USB est branché sur mon Mac, il exécutera un script shell.

Quand je liste tous les fichiers du répertoire / des volumes, je reçois

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

Ce que je veux faire, c'est lister tous les dossiers et fichiers situés dans WED ou n'importe quel périphérique USB qui apparaît, excluant donc les répertoires

.       ..      .DS_Store   MobileBackups   Storage

Me laissant avec

WED

Ce que j'ai pour le script jusqu'à présent est:

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

J'ai essayé plusieurs manières différentes mais il finit toujours par lister chaque fichier du répertoire / Volumes.

Toute aide serait grandement appréciée. Merci Brett

De plus, c'est MAC OS X El Capitan

Brett Reinhard
la source
Maintenant, à la lumière du jour et en repensant à ce que j’ai écrit la nuit dernière, j’ai modifié le code pour n’utiliser que grep comme il est écrit maintenant, il ne peut renvoyer que le ou les noms de chemin d'accès complets du ou des périphériques de bloc USB montés à partir de la sortie de System Profiler en un seul. grep processus (par bloc périphérique USB). Je suppose que j'étais trop fatigué pour le voir la nuit dernière. :)
user3439894
A modifié le code une nouvelle fois pour gérer les espaces dans l'étiquette du périphérique de bloc USB. Désolé pour toute confusion avec tout cela. :)
user3439894

Réponses:

3

Puisque tu veux seulement find Pour agir sur les périphériques de bloc USB, voici un exemple d'utilisation des informations rapportées par System Profiler pour obtenir le point de montage de tout périphérique de bloc USB connecté et monté. En procédant ainsi, peu importe les autres points de montage existants. /Volumes le nom du périphérique de bloc USB n'a pas d'importance, car il est vérifié par System Profiler et non par le ls commander.

J'ai modifié le code, encore une fois, en supprimant la ligne de commande composée, car il est peu probable qu'il soit exécuté de cette façon et qu'il est plus facile à gérer sous forme de script tout en ajoutant la possibilité de gérer des espaces dans le nom de libellé du périphérique de blocage USB. .

En modifiant temporairement le séparateur de champ interne $IFS, ajouter IFS=$'\n' au script ignorera les espaces en tant que séparateur dans la sortie de grep quand passé à find. Afin de ne pas jouer avec le code dans le reste de votre script, je reçois l’état de $IFS et puis reposez-le après.

Dans un 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"

le system_profiler SPUSBDataType affiche les informations sur le bus USB et les achemine grep obtenir /Volumes/$whatever par exemple. /Volumes/USB Drive en utilisant -oE pour le '/Volumes/.*$' qui sort /Volumes/ et tout ce qui suit après la fin de la ligne, donc '/Volumes/.*$' traduira le nom de chemin complet du point de montage de tout périphérique de bloc USB monté. Donc, quel que soit le périphérique de blocage USB monté, il est affecté à $p (J'ai choisi "p" pour chemin ) et utilisé avec find J'ai ajouté le /* après cela, il ne produirait pas la fichiers de points . le if bloc est là pour éviter toute sortie si aucun périphérique de bloc USB n'est monté.

user3439894
la source
Merci, c’était exactement ce dont j’avais besoin et c’est une excellente explication car je suis toujours en train d’apprendre le bash.
Brett Reinhard
@BrettReinhard, si vous avez besoin d'explications supplémentaires, n'hésitez pas.
user3439894
Pouvez-vous m'expliquer les déclarations antérieures à la déclaration for Je suis encore incertain pour la syntaxe des choses.
Brett Reinhard
@BrettReinhard, j'ai écrit une explication détaillée, mais il faudrait remplir 3 commentaires distincts. ceci de Wikipedia et le $IFS section dans Guide avancé de script de bash: 9.1. Variables internes pour une meilleure compréhension de la variable Bash du séparateur de champ interne [ $IFS ]. Ensuite, si vous ne comprenez pas pourquoi je l'ai écrit comme je l'ai fait, je verrai si je peux le réduire à un seul champ de commentaire (600 caractères maximum).
user3439894
1

Voici une variante de la solution user3439894 sans configurer IFS ni mettre en boucle.

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

Les données sont analysées à partir de system_profiler avec awk. awk imprime les points de montage terminés par le caractère nul qui est ensuite redirigé vers xargs et les résultats sont écrits pour outfile.

Pour exclure les fichiers de points de la sortie, ajoutez l'option! -name (not name) et! -path (pas chemin) à la commande de recherche.

system_profiler SPUSBDataType                       |
awk -F": " '/Mount Point/ {printf("%s%c", $2, 0)}'  |
xargs -0 -IX find X ! -name '.*'  ! -path 'X/.*/*' 2>/dev/null >outfile
fd0
la source
Je n'arrête pas de me dire que j'ai besoin d'apprendre awk! :) Base sur les commentaires de la réponse de chazlarson Brett ne veut pas que les fichiers point apparaissent, alors votre exemple peut-il être modifié facilement pour les exclure de la sortie? Quoi qu'il en soit, bonne réponse! +1
user3439894
0

Mon / Volumes dir:

 ➜  /Volumes  ls
BOOTCAMP      Cool Stuff    Macintosh HD  Recovery HD

Cette commande répertorie uniquement les fichiers sur le 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...

Vous pouvez ajouter plus de lecteurs à cette liste:

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

Trouvé ici: http://www.theunixschool.com/2012/07/find-command-15-examples-to-exclude.html

chazlarson
la source
Merci merci! Je vais jouer avec cela et voir comment les choses se passent
Brett Reinhard
Lorsque vous ajoutez plus de noms, où -prune entre-t-il, est-ce le dernier avant l'impression?
Brett Reinhard
trouver . -type d (-name MobileBackups -o -name Storage -o -name .DS_Store -o -name ' / * /. ') -prune -o -print J'ai donc ceci ici et je travaille parfaitement, sauf que dans le lecteur ./WED, il affiche ./WED/.fsevent et d'autres fichiers. J'ai essayé d'exclure ceux-ci mais cela n'a pas semblé fonctionner.
Brett Reinhard
trouver . -type d (-name Boxcryptor -o -name Bitcasa \ Drive -o -name BOOTCAMP -o -name C -o -name Cloud \ Drive) -prune -o -print | egrep -i -v -e "\ ./ [A-Za-z0-9]. * / \ .. *" me donne une liste sans aucun fichier de points de premier niveau.
chazlarson