Lista plików rekurencyjnie w CLI Linux ze ścieżką względem bieżącego katalogu

224

Jest to podobne do tego pytania , ale chcę dołączyć ścieżkę względem bieżącego katalogu do unixa. Jeśli wykonam następujące czynności:

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 zwróci:

file.txt
file1.txt
file2.txt

Jak mogę uzyskać dołączanie ścieżek względem bieżącego katalogu przy użyciu standardowych poleceń Uniksa?

Darryl Hein
źródło
4
To tylko pokazuje, że ls brakuje tej funkcji.
Arjun Singri
1
Szkoda, że ​​wszystkie te rozwiązania wymagają findlub tree. Przesyłam do urządzenia z Androidem, na którym wydaje mi się, że mam tylko lsi żadne z tych innych narzędzi: /
Ponkadoodle

Odpowiedzi:

304

Użyj znajdź:

find . -name \*.txt -print

W systemach korzystających z GNU find, podobnie jak większość dystrybucji GNU / Linux, możesz pominąć -print.

Andru Luvisi
źródło
11
... a jeśli o to chodzi, możesz pominąć „.”
Adam Mitz
7
Aby uzyskać ścieżki bezwzględne, użyjfind $(pwd) -name \*.txt
Zags
2
Jeśli wzorzec ma część nazwy katalogu, należy użyć -path "*docs/*.txt"zamiast -name. -wholenamejest taki sam jak-path
dashy
9
Służy -type fdo zwracania tylko plików, a nie katalogów, dowiązań symbolicznych itp.
użytkownik
2
-name "*.txt"NIE będzie pasować file.TXT- zawsze używaj -iname "*.txt"zamiast tego, bez rozróżniania wielkości liter.
ccpizza
73

Użyj 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ć, grepaby odfiltrować te, które chcesz.


Jeśli polecenie nie zostanie znalezione, możesz je zainstalować:

Wpisz następujące polecenie, aby zainstalować polecenie drzewa w systemach RHEL / CentOS i Fedora:

# yum install tree -y

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

$ sudo apt-get install tree -y
Stephen Irons
źródło
2
jakieś ustawienie, aby wyświetlić tylko pliki i wykluczyć foldery?
thebugfinder
25

Spróbować find. Możesz to sprawdzić dokładnie na stronie podręcznika, ale wygląda to tak:

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

tak dla twojego przykładu

find . -name "*.txt"

powinien dać ci to, czego chcesz.

Jonathan Adelson
źródło
9

Zamiast tego możesz użyć find:

find . -name '*.txt'
Sherm Pendley
źródło
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 czyni to poprzez „grzeszenie” przy analizie ls, co jest uważane przez społeczności GNU i Ghostscript za złą formę.

El Guesto
źródło
2
@ CAFEBABE: analizowanie wyników jest tabu, lsponieważ zwykle prowadzi do błędów. To zdanie próbowało to zawołać. Zawierał również żart, który usunąłem.
Adam Katz
4
DIR=your_path
find $DIR | sed 's:""$DIR""::'

„sed” usunie „twoja_ścieżka” ze wszystkich wyników „znajdź”. I otrzymujesz względem ścieżki „DIR”.

h-dima
źródło
to jest dokładnie to, czego potrzebuję, ale wciąż jest to dla mnie pełna ścieżka?
v3nt
1
nie używaj apostrofów - find / tmp | sed s: "/ tmp" :: | więcej
Kieren Dixon
4

Aby uzyskać rzeczywistą pełną nazwę ścieżki żądanych plików za pomocą polecenia find, użyj go z poleceniem pwd:

find $(pwd) -name \*.txt -print
ZaSter
źródło
1

Oto skrypt Perla:

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();

stosowanie:

ls -LR | perl format_ls-LR.pl
Eric Keller
źródło
To okropny program w Perlu. Prawdopodobnie jest 2-3 razy dłuższy i bardziej skomplikowany niż powinien.
Brad Gilbert
1

Możesz utworzyć funkcję powłoki, np. W swoim .zshrclub .bashrc:

filepath() {
    echo $PWD/$1
}

filepath2() {
    for i in $@; do
        echo $PWD/$i
    done
}

Oczywiście pierwszy działałby tylko na pojedynczych plikach.

rxw
źródło
1

Znajdź w systemie plików plik o nazwie „filename”, rozpoczynając wyszukiwanie od katalogu głównego „/”. „Nazwa pliku”

find / -name "filename" 
użytkownik2101432
źródło
1

Jeśli chcesz zachować szczegóły w pliku wyjściowym, takie jak rozmiar pliku itp., Powinno to działać.

sed "s|<OLDPATH>|<NEWPATH>|g" input_file > output_file
rajeshk
źródło
1

W skorupce ryby możesz to zrobić, aby wyświetlić rekursywnie wszystkie pliki pdf, w tym te w bieżącym katalogu:

$ ls **pdf

Po prostu usuń „pdf”, jeśli chcesz pliki dowolnego typu.

rien333
źródło
0

Możesz zaimplementować tę funkcję w ten sposób
Po pierwsze, używając polecenia ls wskazanego na docelowy katalog. Później za pomocą polecenia find odfiltruj z niego wynik. Z twojego przypadku wygląda to tak - zawsze nazwa pliku zaczyna się od słowa file***.txt

ls /some/path/here | find . -name 'file*.txt'   (* represents some wild card search)
Sireesh Yarlagadda
źródło
0

W mycase, z poleceniem drzewa

Względna ścieżka dostępu

tree -ifF ./dir | grep -v '^./dir$' | grep -v '.*/$' | grep '\./.*' | while read file; do
  echo $file
done

Absolutna ścieżka

tree -ifF ./dir | grep -v '^./dir$' | grep -v '.*/$' | grep '\./.*' | while read file; do
  echo $file | sed -e "s|^.|$PWD|g"
done
Matsumoto Kazuya
źródło