Frage

Dies ist vergleichbar mit diese Frage , aber ich mag den Pfad relativ zum aktuellen Verzeichnis in UNIX enthalten. Wenn ich Folgendes tun:

ls -LR | grep .txt

Es beinhaltet nicht die vollständigen Pfade. Zum Beispiel habe ich die folgende Verzeichnisstruktur:

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

Der obige Code wird zurückgegeben:

file.txt
file1.txt
file2.txt

Wie kann ich es die Pfade enthalten relativ zum aktuellen Verzeichnis mit Standard-Unix-Befehle?

War es hilfreich?

Lösung

Verwendung finden:

find . -name \*.txt -print

Auf Systemen, die GNU verwenden finden, wie die meisten GNU / Linux-Distributionen, können Sie die -Print auslassen kann.

Andere Tipps

Verwenden tree, mit -f (vollständiger Pfad) und -i (keine Einbuchtung Zeilen):

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

Sie können dann mit grep diejenigen herausgefiltert werden Sie wollen.


Wenn der Befehl nicht gefunden wird, können Sie es installieren:

Geben Sie folgenden Befehl Baum Befehl auf RHEL / CentOS und Fedora Linux zu installieren:

# yum install tree -y

Wenn Sie mit Debian / Ubuntu, Mint Linux-Typ in Ihrem Terminal folgenden Befehl ein:

$ sudo apt-get install tree -y

Versuchen find. Sie können es genau in der man-Seite nachschlagen, aber es ist sorta wie folgt aus:

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

so für Ihr Beispiel

find . -name "*.txt"

sollten Sie geben, was Sie wollen.

Sie könnten finden, benutzen Sie stattdessen:

find . -name '*.txt'

Das funktioniert der Trick:

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

Aber es tut, indem er mit dem Parsen von ls „sündigt“, obwohl, die schlechte Form angesehen wird durch die GNU und Ghost Gemeinden.

DIR=your_path
find $DIR | sed 's:""$DIR""::'

‚sed‘ gelöscht werden ‚your_path‘ aus allen Ergebnissen ‚finden‘. Und Sie empfangen in Bezug auf ‚DIR‘ Pfad.

Um die tatsächlichen vollständigen Pfad Dateinamen der gewünschten Dateien mit dem Befehl find zu erhalten, verwenden Sie es mit dem Befehl pwd:

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

Hier ist ein Perl-Skript:

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

Nutzung:

ls -LR | perl format_ls-LR.pl

Sie könnten eine Shell-Funktion erstellen, zum Beispiel in Ihrem .zshrc oder .bashrc:

filepath() {
    echo $PWD/$1
}

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

Die erste würde auf einzelne Dateien funktionieren nur, offensichtlich.

Hier finden Sie die Datei mit dem Namen „Dateiname“ auf dem Dateisystem die Suche aus dem Stammverzeichnis „/“ beginnen. Der "Dateiname"

find / -name "filename" 

Wenn Sie mit ls wie Dateigröße usw. in Ihrer Ausgabe die Details kommen erhalten dann sollte diese Arbeit.

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

Sie können diese Funktionalität wie dieser
implementieren Zum einen wies den Befehl ls mit der gezielten Verzeichnis. Später mit Befehl find das Ergebnis daraus filtern. Von Ihrem Fall, es klingt wie - immer der Dateiname mit einem Wort beginnt file***.txt

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

In der Fisch Shell rel="nofollow, können Sie dies tun, alle PDF-Dateien rekursiv aufzulisten, einschließlich die, die im aktuellen Verzeichnis :

$ ls **pdf

Just entfernen ‚pdf‘, wenn Sie Dateien jeder Art wollen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top