2008-10-29 11 views
188

Jest to podobne do this question, ale chcę dołączyć ścieżkę do katalogu bieżącego w systemie UNIX. Jeśli wykonuję następujące czynności:Lista plików rekursywnie w Linux CLI ze ścieżką względem bieżącego katalogu

ls -LR | grep .txt 

Nie obejmuje pełnych ścieżek. Na przykład, mam następującą strukturę katalogów:

test1/file.txt 
test2/file1.txt 
test2/file2.txt 

Powyższy kod powrotu:

file.txt 
file1.txt 
file2.txt 

Jak mogę zmusić go do ścieżek względnych należą do bieżącego katalogu przy użyciu standardowych poleceń Unix?

+3

To pokazuje, że ls nie ma tej funkcji. –

+0

To wstyd, że wszystkie te rozwiązania wymagają 'find' lub' tree'. Przełączam się na urządzenie z Androidem, w którym wydaje mi się, że mam tylko 'ls' i żadne z tych innych narzędzi:/ – Ponkadoodle

Odpowiedz

254

Wykorzystanie find:

find . -name \*.txt -print 

W systemach wykorzystujących GNU znaleźć, podobnie jak większości dystrybucji GNU/Linux, można pominąć -Print.

+8

... i jeśli o to chodzi, możesz pominąć". " –

+4

Dla ścieżek bezwzględnych użyj 'find $ (pwd) -name \ *. Txt' – Zags

+1

Jeśli wzorzec zawiera część nazwy katalogu, należy użyć' -path "* docs/*. Txt" 'zamiast" -name ". '-wholename' jest taka sama jak' -path' – dashesy

23

Wypróbuj find. Można to sprawdzić dokładnie w manualu, ale to jakoś tak:

find [start directory] -name [what to find]

więc na swoim przykładzie

find . -name "*.txt"

powinny dać ci to, co chcesz.

9

znaleźć można użyć zamiast:

find . -name '*.txt' 
4
DIR=your_path 
find $DIR | sed 's:""$DIR""::' 

'sed' usunie '' ze wszystkich modułów nauczania update_applied 'Szukaj' wyniki. Otrzymujesz relację względem ścieżki "DIR".

+0

to jest dokładnie to, czego potrzebuję, ale nadal wypluwa pełną ścieżkę dla mnie? – v3nt

+1

nie używaj apostrofów - find/tmp | sed s: "/ tmp" :: | więcej –

1

Oto skrypt Perl:

sub format_lines($) 
{ 
    my $refonlines = shift; 
    my @lines = @{$refonlines}; 
    my $tmppath = "-"; 

    foreach (@lines) 
    { 
     next if ($_ =~ /^\s+/); 
     if ($_ =~ /(^\w+(\/\w*)*):/) 
     { 
      $tmppath = $1 if defined $1;  
      next; 
     } 
     print "$tmppath/$_"; 
    } 
} 

sub main() 
{ 
     my @lines =(); 

    while (<>) 
    { 
     push (@lines, $_); 
    } 
    format_lines(\@lines); 
} 

main(); 

wykorzystania:

ls -LR | perl format_ls-LR.pl 
+0

To jest straszny program Perla. To prawdopodobnie 2-3 razy dłuższe i bardziej skomplikowane, niż powinno być. –

59

Zastosowanie tree z -f (pełna ścieżka) i -i (bez linii wcięcia):

tree -if --noreport . 
tree -if --noreport directory/ 

Następnie możesz użyć grep, aby odfiltrować te, które chcesz.


Jeśli polecenie nie zostanie znaleziony, można go zainstalować: Następujące polecenie

Rodzaj zainstalować polecenie drzewa na RHEL/CentOS i Fedora Linux:

# yum install tree -y 

Jeśli używasz Debiana/Ubuntu, Mint Linux Typ następujące polecenie w terminalu:

$ sudo apt-get install tree -y 
+1

dowolne ustawienie, aby wyświetlić tylko te pliki i wykluczyć foldery? – thebugfinder

1

można CRE zjadł funkcję powłoki, np.w .zshrc lub .bashrc:

filepath() { 
    echo $PWD/$1 
} 

filepath2() { 
    for i in [email protected]; do 
     echo $PWD/$i 
    done 
} 

Pierwszy z nich będzie pracować na pojedynczych plikach tylko, oczywiście.

4

Aby uzyskać rzeczywiste nazwy pliku pełnej ścieżki pożądanego plików przy użyciu polecenia find, użyj go z pwd polecenia:

find $(pwd) -name \*.txt -print 
1

Znajdź plik o nazwie „nazwa pliku” w systemie plików zaczynając poszukiwania od katalog główny "/". W „nazwa pliku”

find/-name "filename" 
1

Jeśli chcesz zachować dane pochodzą z ls jak rozmiar pliku itp w swoim wyjściu to powinno działać.

sed "s|<OLDPATH>|<NEWPATH>|g" input_file > output_file 
0

można zaimplementować tę funkcjonalność jak ten
Po pierwsze, za pomocą polecenia ls wskazał docelowego katalogu. Później za pomocą polecenia find filtruj wynik z niego. Od Twoim przypadku, to brzmi jak - zawsze nazwa pliku rozpoczyna się słowem file***.txt

ls /some/path/here | find . -name 'file*.txt' (* represents some wild card search) 
5

To załatwia sprawę:

ls -R1 $PWD | while read l; do case $l in *:) d=${l%:};; "") d=;; *) echo "$d/$l";; esac; done | grep -i ".txt"

Ale to robi, że przez „grzeszyć” z parsowania z ls, co jest uważane za złą formę przez społeczności GNU i Ghostscript.

+0

Naprawdę nie rozumiem ostatniego zdania ... – CAFEBABE

+2

@CAFEBABE: jest uważane za tabu do analizowania wyników 'ls', ponieważ zazwyczaj prowadzi do błędów. Wspomniane zdanie próbowało to wyjaśnić. Miałem też żart, który usunąłem. –

Powiązane problemy