Lista wszystkich plików na urządzeniu USB z / Volumes Shell Script

0

Aby to wszystko wyczyścić, mam na moim Macu akcje folderów instalacyjnych, za każdym razem, gdy urządzenie USB jest podłączone do mojego komputera, uruchomi skrypt powłoki.

Kiedy wymieniam wszystkie pliki w katalogu / woluminach, otrzymuję

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

Chcę tylko wyświetlić wszystkie foldery i pliki znajdujące się w WED lub dowolnym pojawiającym się USB, wykluczając w ten sposób katalogi

.       ..      .DS_Store   MobileBackups   Storage

Opuszczając mnie

WED

Do tej pory mam dla skryptu:

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

Próbowałem wielu różnych sposobów, ale wciąż kończy się wyświetlaniem każdego pojedynczego pliku w katalogu / Volumes.

Każda pomoc byłaby bardzo mile widziana. Dzięki, Brett

Dodatkowo jest to MAC OS X El Capitan

Brett Reinhard
źródło
Teraz, w świetle dnia i patrząc wstecz na to, co napisałem zeszłej nocy, zmodyfikowałem kod, aby używać go tylko grepraz, a teraz, jak napisałem, może zwrócić tylko pełną ścieżkę (nazwy) zamontowanych urządzeń blokowych USB z wyjście programu Profil systemu w jednym grepprocesie (na urządzenie blokujące USB). Sądzę, że byłem zbyt zmęczony, żeby zobaczyć to wczoraj wieczorem. :)
user3439894
Zmodyfikowano kod ponownie, aby obsługiwać spacje na etykiecie urządzenia blokowego USB. Przepraszam za wszelkie zamieszanie z tym wszystkim. :)
user3439894

Odpowiedzi:

3

Ponieważ chcesz finddziałać tylko na urządzeniach blokowych USB, poniżej przedstawiono przykład wykorzystania informacji zgłoszonych przez profil systemu, aby uzyskać punkt montażu dowolnego podłączonego i zamontowanego urządzenia blokowego USB. Robiąc to w ten sposób, nie ma znaczenia, jakie inne punkty montowania istnieją, /Volumesani nie ma znaczenia, jak nazywa się nazwa urządzenia blokowego USB, ponieważ jest to ustalone przez program profilujący system, a nie lspolecenie.

Po raz kolejny zmodyfikowałem kod, usuwając złożony wiersz poleceń, ponieważ prawdopodobnie i tak nie zostanie uruchomiony w ten sposób i jest łatwiejszy do utrzymania w formie skryptu, dodając możliwość obsługi spacji w nazwie etykiety urządzenia bloku USB .

Przez tymczasową zmianę wewnętrznego separatora pola $IFSdodanie IFS=$'\n'do skryptu zignoruje przestrzeń (i) jako separator na wyjściu greppo przekazaniu do find. Żeby nie mieszać się z żadnym kodem w pozostałej części skryptu, otrzymuję stan, $IFSa następnie go później przywracam.

W skrypcie 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 SPUSBDataTypeInformacji wyjść na magistrali USB i rury to przez grepuzyskać /Volumes/$whatevernp /Volumes/USB Driveużywając -oEza '/Volumes/.*$'które wyjścia /Volumes/i wszystko po nim do końca linii, co '/Volumes/.*$'przełoży pełną ścieżkę punktu montowania jakichkolwiek zamontowanych urządzeń blokowych USB. Więc niezależnie od tego, jakie urządzenie blokowe USB jest zamontowane, jest przypisane $p(wybrałem „p” dla ścieżki ), a gdy jest używane z finddodałem to /*po, aby nie wysyłało plików dotf . ifBlok jest tam w celu uniknięcia wyjście, jeśli są zamontowane żadne urządzenie blokowe USB.

użytkownik3439894
źródło
Dziękuję, że to było dokładnie to, czego potrzebowałem i jest świetnym wyjaśnieniem, ponieważ wciąż uczę się bash.
Brett Reinhard
@BrettReinhard, Jeśli potrzebujesz dalszych wyjaśnień, po prostu zapytaj.
user3439894
Czy możesz wyjaśnić mi deklaracje przed stwierdzeniem for? Nadal jestem niepewny składni rzeczy.
Brett Reinhard
@BrettReinhard, napisałem szczegółowe wyjaśnienie, jednak wypełniłoby to 3 oddzielne komentarze, więc nie sądzę, żebym tak dużo pisał, jak komentarze, więc najpierw przeczytaj to z Wikipedii i $IFSsekcji w przewodniku Advanced Bash-Scripting Guide: 9.1. Zmienne wewnętrzne dla lepszego zrozumienia zmiennej Bash wewnętrznego separatora pól [ $IFS]. Jeśli nie rozumiesz, dlaczego napisałem to tak, jak ja, zobaczę, czy mogę zawęzić zakres do jednego pola komentarza (maksymalnie 600 znaków).
user3439894
1

Oto wariant rozwiązania user3439894 bez ustawiania IFS lub pętli.

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

Dane są analizowane system_profilerz awk. awkwypisuje punkty montowania zakończone znakiem pustym, który jest następnie przesyłany strumieniowo xargsi wyniki są zapisywane outfile.

Aby wykluczyć pliki kropek z wyjścia, dodaj opcję! -name (nie nazwa) i! -path (nie ścieżka) do polecenia 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
fd0
źródło
Powtarzam sobie, że muszę się uczyć awk! :) Opierając się na komentarzach do odpowiedzi chazlarsona, Brett nie chce, aby pliki kropek były wyświetlane, więc czy Twój przykład można łatwo zmodyfikować, aby wykluczyć je z wyników? W każdym razie miła odpowiedź! +1
użytkownik3439894
0

My / Volumes reż:

   /Volumes  ls
BOOTCAMP      Cool Stuff    Macintosh HD  Recovery HD

To polecenie wyświetla tylko pliki na 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...

Możesz przypisać więcej dysków do tej listy:

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

Znaleziono tutaj: http://www.theunixschool.com/2012/07/find-command-15-examples-to-exclude.html

chazlarson
źródło
Dziękuję dziękuję! Bawię się tym i zobaczę, jak się sprawy potoczą
Brett Reinhard
Dodając więcej nazwisk, do których przychodzi -prune, czy byłby to ostatni przed wydrukowaniem?
Brett Reinhard
odnaleźć . -type d (-name MobileBackups -o -name Przechowywanie -o -name .DS_Store -o -name ' / * /. ') -prune -o -print Więc mam to tutaj i pracuję idealnie, z wyjątkiem faktu, że wewnątrz dysk ./WED, który pokazuje ./WED/.fsevent i inne pliki .something. Próbowałem je wykluczyć, ale nie działało.
Brett Reinhard
odnaleźć . -type d (-name Boxcryptor -o -name Bitcasa Dysk -o -name BOOTCAMP -o -name C -o -name Cloud Dysk) -prune -o -print | egrep -i -v -e "/ [A-Za-z0-9]. * / .. *" daje mi listę bez żadnych plików kropek najwyższego poziomu.
chazlarson