Mam ten skrypt dla OSX do wyszukiwania folderów, które zawierają tylko jeden plik, i jeśli ten plik jest plikiem audio, który wysyła ścieżkę do pliku audio
find "$1" -type d -exec sh -c '[[ $(find "$0" -mindepth 1 | wc -l) -eq 1 ]]
&& [[ $(find "$0" -mindepth 1 -type d | wc -l) -eq 0 ]]
&& find "$0"' {} \; |egrep ".mp4|.mp3|.ogg|.flac|.wma|.m4a"
czyli używaj jak
./findodd.sh /Users/paul/Music
ale potrzebuję dwóch ulepszeń:
Co mogę zmienić, aby wyświetlić pliki w folderach zawierających 2 pliki, 3 pliki ectera, byłoby nawet lepiej, gdyby można było przekazać je jako parametr
Obecnie znajduje foldery zawierające tylko jeden plik, a ten plik musi być plikiem audio, ale naprawdę chcę, aby znalazł folder zawierający tylko jeden plik audio, tj. Jeśli folder zawiera trzy pliki, ale tylko jeden jest plikiem audio I chcesz, aby ten plik audio był na liście.
dzięki Paul
Odpowiedzi:
Przykładowe przebiegi:
A tutaj kod:
Iteruje po wszystkich podkatalogach danego katalogu i używa globbingu do odczytu wszystkich nazw plików audio bieżącego podkatalogu w tablicy
files
. Jeśli rozmiar tablicy jest zgodny z żądaną wartością, wypisuje nazwy plików oddzielone znakiem nowej linii.EDYCJA: To jest moje wcześniejsze podejście oparte na założeniu, że chcesz wydrukować foldery, a nie nazwy plików. Zostawię to tutaj na przyszłość.
To, co robi, to znalezienie wszystkich plików z wymienionymi rozszerzeniami audio i wydrukowanie ich komponentów katalogowych zamiast pełnej ścieżki. Daje to listę folderów nadrzędnych dla wszystkich plików audio. W
uniq
pomija nieunikalne linii, które powinny dać wynik jesteś po to jest tylko drukowanie folderów, które zawierają dokładnie jeden plik audio.Teoretycznie powinno to być trochę szybsze niż wcześniejsza próba.
Możesz to poprawić, aby zaspokoić swój pierwszy punkt, licząc zduplikowane linie i drukując tylko te foldery, które pasują do żądanej liczby. Naiwnym rozwiązaniem byłoby:
chociaż może być lepiej
uniq
połączyć jedną część i prawą stronę rury w jednejawk
linii.źródło
find
wypisze ścieżki względne, jeśli poda ścieżki względne jako wejściowe i bezwzględne, jeśli poda ścieżki bezwzględne (a więc zależy od wywołania). Zaktualizowałem swój post i dodałem nowe rozwiązanie oparte na twoim wyjaśnieniu, o którym myślę, że masz na myśli. Kod jest tak krótki, jak twój początkowy fragment, ale spełnia oba wymagania, jeśli teraz je poprawnie rozumiem i powinien być bardziej czytelny :-)DRUGIE PODEJŚCIE
OK, po samodzielnym wypróbowaniu tego w moim własnym folderze Muzyka jest to rozwiązanie dla obu twoich żądań:
W twoim skrypcie było kilka błędów:
mindepth
zamiastmaxdepth
..wma
by pasowało do „Snowman.txt”.Uwagi na temat mojego skryptu:
findodd.sh <top_folder> <no_of_files>
COMMAND
jest w rzeczywistości 2 literałami ciągów po obu stronach$2
. To naprawdę ważne.echo "$0"
drugifind
.Teraz testowałem na maszynie Arch Linux, a moja powłoka jest „bash”, więc nie mam pojęcia, czy to działa na OSX, ponieważ wszystkie powłoki NIE są sobie równe. :-)
WCZEŚNIEJSZA PIERWSZA PRÓBA:
Hmmmm. Nie wiem, jak podobny jest OSX do Uniksa / Linuksa, ale dam to w parze.
Odpowiedź na oba pytania, jak sądzę, leży w pierwszym teście polecenia „sh -c”. Oto fragment, który brzmi:
Aby przekazać drugi parametr do skryptu dla liczby plików, powinieneś być w stanie po prostu zmienić „1” na 2 $, więc test będzie:
Nie umieszczaj cudzysłowów wokół,
$2
ponieważ w przeciwnym razie zostanie zinterpretowany jako drugi parametr przekazany do polecenia „sh -c”, a nie do skryptu.Linia poleceń byłaby wtedy:
Aby osiągnąć swoje drugie wymaganie, jak rozumiem, musisz umieścić
egrep
polecenie w pierwszym teście, a więc:Być może będziesz musiał oglądać cytaty.
W każdym razie daj sobie spokój i daj nam znać.
źródło
Możesz zaimplementować to w Pythonie, wykonując coś takiego:
Jeśli możesz
chmod +x findodd.py
, uruchom go w ten sam sposób, w jaki uruchamiasz swój bieżący skrypt, np .:źródło