2011-02-04 12 views
9

W skrypcie basha chcę przetestować wszystkie katalogi w bieżącym katalogu roboczym i zrobić dla nich rzeczy. Mogą zawierać specjalne symbole, w szczególności białe spacje. Jak mogę to zrobić? Mam:Pętla nad katalogami z białymi znakami w Bash

for dir in $(ls -l ./) 
do 
    if [ -d ./"$dir" ] 

ale to pomija moje katalogi z białymi znakami w ich nazwie. Każda pomoc jest doceniana.

Odpowiedz

24

spróbuj tego:

for dir in */ 
+0

to robi, ale dlaczego? */jest znakiem wieloznacznym dla wszystkich katalogów? – jakev

+1

Wow, który faktycznie działa, nawet w katalogach ze spacjami. Tak więc bash musi domyślnie zacytować wartości, gdy rozszerza znak wieloznaczny? Kocham to. – harpo

+0

@JakeVA: Tak, dokładnie. Zauważ, że nie będzie zawierać ukrytych katalogów, chyba że ustawisz 'shopt -s dotglob'. Jeśli w bieżącym katalogu nie ma żadnych podkatalogów, powinieneś także ustawić 'shopt -s nullglob' (na wszelki wypadek ustaw). –

8

Wybieraj rozwiązań:

http://www.cyberciti.biz/tips/handling-filenames-with-spaces-in-bash.html

Ogólną ideą jest, aby zmienić domyślny separator (IFS).

#!/bin/bash 
SAVEIFS=$IFS 
IFS=$(echo -en "\n\b") 
for f in * 
do 
    echo "$f" 
done 
IFS=$SAVEIFS 
+0

Nie wspomniałem o tym w moim pytaniu, ale próbowałem tego. Myślę, że brakujący element był iterowaniem ponad * lub */zamiast wyników ls – jakev

+0

Znalazłem tutaj moje rozwiązanie, używając 'find. -print0 | podczas odczytu -d $ '\ 0' plik', aby ustawić pętlę 'do' ze zmienną' plik'. – Air

3

Istnieje wiele sposobów. Oto coś, co jest bardzo szybki:

find /your/dir -type d -print0 | xargs -0 echo 

ten skanuje/twoja/dir rekurencyjnie dla katalogów i przejdzie wszystkie ścieżki do komendy „echo” (wymiana od potrzeb). Może wywoływać echo wiele razy, ale spróbuje przekazać tyle nazw katalogów, na ile pozwala konsola na raz. Jest to niezwykle szybkie, ponieważ trzeba uruchomić kilka procesów. Ale działa tylko na programach, które mogą przyjąć dowolną liczbę wartości jako opcje. -print0 mówi znaleźć na osobnych ścieżkach plików przy użyciu zerowy bajt (i -0 mówi xargs czytać argumenty rozdzielając je bajtem zerowym) Jeśli nie mają później, można to zrobić:

find /your/dir -type d -print0 | xargs -0 -n 1 echo 

lub

Opcja -n 1 spowoduje, że xargs nie będzie przekazywać więcej argumentów niż jeden w tym samym czasie do twojego programu. Jeśli nie chcesz, aby wyszukiwanie skanowało rekursywnie, możesz określić opcję głębokości, aby wyłączyć rekursję (nie znasz jednak składni na pamięć).

Choć jest to użyteczne w danym skrypcie, to kolejne pytanie ;-).

+0

Należy zauważyć, że xargs ma dodatkowe narzędzia, które się tutaj przydają, np. -J . Przykład: xargs -0 -J% mv% ~/some_other_folder –

Powiązane problemy