USB Aygıtındaki Tüm Dosyaları Listeler / Birimler Kabuk Betiği


0

Her şeyi düzeltmek için Mac'imde bir USB aygıtını taktığımda mac'umda klasör oluşturma ayarları yapıyorum, bir kabuk betiği çalışacak.

Dizindeki / Birimlerdeki tüm dosyaları listelediğimde

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

Yapmak istediğim, WED'de bulunan tüm klasörleri ve dosyaları veya açılan herhangi bir USB'yi listelemek, böylece dizinleri dışlamak

.       ..      .DS_Store   MobileBackups   Storage

Beni terk etmek

WED

Senaryo için şu ana kadar elimde olan şey:

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

Birden çok farklı yol denedim, ancak yine de / Volumes dizinindeki her bir dosyayı listelemeye devam ediyor.

Herhangi bir yardım çok takdir edilecektir. Sağol Brett

Ayrıca, MAC OS X El Capitan


Şimdi, gün ışığında ve dün gece yazdıklarımın arkasına bakarken, kodu yalnızca bir grepkez kullanacak şekilde değiştirdim ve şimdi yazıldığı gibi, takılı USB blok cihazlarının tam nitelikli yol adlarını geri alabilir. Bir grepişlemde Sistem Profilcisi çıkışı (birleştirilmiş USB blok cihazı başına). Sanırım dün gece göremeyecek kadar yorgundum. :)
user3439894 14

USB blok cihazının etiketindeki boşlukları işlemek için kodu bir kez daha değiştirin. Tüm bunlarla karışıklık için özür dilerim. :)
user3439894

Yanıtlar:


3

Yalnızca findUSB blok aygıtlarına etki etmek istediğiniz için aşağıdakiler, takılı ve monte edilmiş herhangi bir USB blok aygıtının Bağlantı Noktasını almak için Sistem Profilcisi tarafından bildirilen bilgilerin kullanılmasına bir örnektir. Bu şekilde yaparak, hangi bağlantı noktalarının altında /Volumesolduğu ve USB blok aygıtı adının ne lskomutu olduğu değil Sistem Profilcisi'nden tespit ettiği farketmez .

Kodu bir kez daha değiştirdim, bileşik komut satırını kaldırdım, yine de bu şekilde çalıştırılmayacaktı ve USB blok aygıtının etiket adındaki boşlukları işleyebilme kabiliyeti eklerken komut dosyası biçiminde bakımı daha kolay .

Dahili Alan Ayırıcısını geçici olarak değiştirerek, komut dosyasına $IFSekleme , geçtiği zaman IFS=$'\n'çıktılarında boşluk (lar) ayırıcı olarak görmezden grepgelir find. Senaryonuzun geri kalan kısmındaki herhangi bir kodu karıştırmamak için ilk önce yumruk alıyorum $IFSve ardından dinleniyorum.

Bir bash betiğinde:

#!/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 SPUSBDataTypeUSB Bus ve boruların onu aracılığıyla çıkışlar bilgi grepalmak için /Volumes/$whateverörneğin /Volumes/USB Drivekullanarak -oEiçin '/Volumes/.*$'hangi çıkışlar /Volumes/dolayısıyla satırın sonuna ondan sonra ve her şey '/Volumes/.*$', herhangi monte USB blok cihazların bağlama noktasının tam yol adını çevirir. Yani USB blok aygıtı olarak monte edilir ne olursa olsun, atandığı $p(ı için "p" aldı yoluna ) ve birlikte kullanıldığında findekledim /*böylece çıkış olmaz ondan sonra dotfiles . ifBlok hiçbir USB blok aygıtları monte eğer herhangi bir çıktı önlemek için vardır.


Teşekkürler bu tam olarak ihtiyacım olan şeydi ve hala bash öğrendiğim için harika bir açıklama.
Brett Reinhard

@BrettReinhard, Başka bir açıklamaya ihtiyacınız olursa, sadece sorun.
user3439894

Bana for açıklamadan önce yapılan açıklamaları açıklar mısınız?
Brett Reinhard

Ben kadar yapılan yorumlar nedenle ilk okuduğum gönderilmesi gerekiyor sanmıyorum @BrettReinhard, ben ancak 3 ayrı yorumlarınızı doldururdu ayrıntılı bir açıklama yazdı Wikipedia'dan bu ve $IFSiçinde bölüm 9.1: İleri Bash-Komut Rehberi. Dahili Alan Ayırıcı Bash Değişkeninin daha iyi anlaşılması için Dahili Değişkenler [ $IFS]. Öyleyse neden yazdığım gibi yazdığımı anlamıyorsanız, bir yorum alanına daraltabilir miyim (en fazla 600 karakter).
kullanici3439894

1

İşte IFS veya döngü ayarı yapmadan user3439894 çözümünün bir çeşidi.

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

Veriler gelen ayrıştırılır system_profilerile awk. awknull karakteriyle sonlandırılan bağlama noktalarını yazdırır ve sonra bunlar için pipolanır xargsve sonuçları yazılır outfile.

Nokta dosyalarını çıktıdan çıkarmak için seçeneği ekleyin! -smi (isim değil) ve! -path (yol değil) find komutuna.

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

Kendime öğrenmem gerektiğini söylüyorum awk! :) Chazlarson'ın cevabına yapılan açıklamalara dayanarak Brett, nokta dosyalarının gösterilmesini istemiyor, bu yüzden örneğin çıktıda onları dışlamak için örnek kolayca değiştirilebilir mi? Neyse, güzel cevap! +1
kullanıcı3439894

0

My / Volumes dir:

   /Volumes  ls
BOOTCAMP      Cool Stuff    Macintosh HD  Recovery HD

Bu komut yalnızca Recovery HD'deki dosyaları listeler:

  /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...

Bu listeye daha fazla sürücü ekleyebilirsiniz:

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

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


Teşekkür ederim teşekkür ederim! Bununla uğraşacağım ve işlerin nasıl
Brett Reinhard

-Prune'un geldiği yerlere daha fazla isim eklerken, bu baskıdan önceki son isim olur mu?
Brett Reinhard

Bul -tipi d (-Ad MobileBackups -o -name Depolama -o -name .DS_Store -o -name ' / * /. ') -prune -o -print Bu yüzden buradayım ve içinde olduğu gerçeği dışında mükemmel çalışıyor ./WED sürücüsünde ./WED/.fsevent ve diğer .something dosyalarının gösterilmesi. Bunları dışlamaya çalıştım ama işe yaramadı.
Brett Reinhard

Bul -tipi d (-name Boxcryptor -o-ismi Bitcasa \ Sürücü -o-ismi BOOTCAMP -o-ismi C -o-ismi Cloud \ Sürücü) -prune -o -print | egrep -i -v -e "\ ./ [A-Za-z0-9]. * / \ .. *", herhangi bir üst seviye nokta dosyası içermeyen bir liste verir.
chazlarson,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.