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
grep
raz, 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 jednymgrep
procesie (na urządzenie blokujące USB). Sądzę, że byłem zbyt zmęczony, żeby zobaczyć to wczoraj wieczorem. :)Odpowiedzi:
Ponieważ chcesz
find
dział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ą,/Volumes
ani nie ma znaczenia, jak nazywa się nazwa urządzenia blokowego USB, ponieważ jest to ustalone przez program profilujący system, a niels
polecenie.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
$IFS
dodanieIFS=$'\n'
do skryptu zignoruje przestrzeń (i) jako separator na wyjściugrep
po przekazaniu dofind
. Żeby nie mieszać się z żadnym kodem w pozostałej części skryptu, otrzymuję stan,$IFS
a następnie go później przywracam.W skrypcie bash:
system_profiler SPUSBDataType
Informacji wyjść na magistrali USB i rury to przezgrep
uzyskać/Volumes/$whatever
np/Volumes/USB Drive
używając-oE
za'/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 zfind
dodałem to/*
po, aby nie wysyłało plików dotf .if
Blok jest tam w celu uniknięcia wyjście, jeśli są zamontowane żadne urządzenie blokowe USB.źródło
$IFS
sekcji 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).Oto wariant rozwiązania user3439894 bez ustawiania IFS lub pętli.
Dane są analizowane
system_profiler
zawk
.awk
wypisuje punkty montowania zakończone znakiem pustym, który jest następnie przesyłany strumieniowoxargs
i wyniki są zapisywaneoutfile
.Aby wykluczyć pliki kropek z wyjścia, dodaj opcję! -name (nie nazwa) i! -path (nie ścieżka) do polecenia find.
źródło
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ź! +1My / Volumes reż:
To polecenie wyświetla tylko pliki na Recovery HD:
Możesz przypisać więcej dysków do tej listy:
Znaleziono tutaj: http://www.theunixschool.com/2012/07/find-command-15-examples-to-exclude.html
źródło