So listen Sie alle Dateien in einem Verzeichnis mit absoluten Pfaden auf

30

Ich benötige eine Datei (vorzugsweise eine .list-Datei), die den absoluten Pfad jeder Datei in einem Verzeichnis enthält.

Beispiel dir1: file1.txt file2.txt file3.txt

listOfFiles.list:

/Users/haddad/dir1/file1.txt
/Users/haddad/dir1/file2.txt
/Users/haddad/dir1/file3.txt

Wie kann ich das unter Linux / Mac erreichen?

arabian_albert
quelle

Antworten:

30
ls -d "$PWD"/* > listOfFiles.list
Comforse
quelle
würde das unter red hat linux funktionieren?
arabian_albert
4
Dieser Befehl funktioniert in jedem Linux- oder UNIX-Betriebssystem. Wenn Sie eine Datei pro Zeile erhalten möchten, müssen Sie verwendenls -d -1 $PWD/*
MelBurslan
1
Wenn Ihre Dateinamen lang oder die Terminalbreite schmal sind, ist dies der Fall. Sie haben jedoch das Terminalfenster maximiert, um den gesamten Bildschirm zu belegen, oder wenn Ihre Dateinamen (einschließlich des Pfads) sehr kurz sind, ist dies nicht der Fall wahr. -1Option garantiert, dass Sie einen Dateinamen pro Zeile erhalten
MelBurslan
7
Die Addition von @MelBurslan wird nur benötigt, wenn die Ausgabe auf ein Terminal erfolgt. lsErkennt, ob die Ausgabe in eine Datei oder ein Terminal erfolgt.
Runium
9
Dies schlägt fehl, wenn sich viele tausend Dateien im Verzeichnis befinden, dh genug, um die maximale Befehlszeilengröße zu überschreiten (was durch die Tatsache wahrscheinlicher wird, dass die Shell die Dateinamen mit vollem Pfad erweitert). Die findAntwort von @Andy Dalton ist eine bessere Lösung, da es nicht scheitern wird, egal wie viele Dateien aufgelistet werden sollen.
cas
33

Sie können find verwenden. Angenommen, Sie möchten nur reguläre Dateien, dann können Sie Folgendes tun:

find /path/to/dir -type f > listOfFiles.list

Sie können den Typparameter entsprechend anpassen, wenn Sie andere Dateitypen möchten.

Andy Dalton
quelle
7
+1 für den Hinweis auf eine zukunftssicherere Lösung ls. Dadurch findwerden die Unterverzeichnisse rekursiv verarbeitet. Nicht rekursive müssen -maxdepth 1vor dem -typeArgument hinzugefügt werden .
Kubanczyk
@AndyDalton Wie bekomme ich das gleiche zu einem Array in Bash
Kasun Siyambalapitiya
13

Beachten Sie, dass in:

ls -d "$PWD"/* > listOfFiles.list

Die Shell berechnet die Liste der (nicht ausgeblendeten) Dateien im Verzeichnis und übergibt die Liste an ls. lsdruckt einfach diese Liste hier aus, also können Sie auch Folgendes tun:

printf '%s\n' "$PWD"/*
Stéphane Chazelas
quelle
3
Die Verwendung von printfhat den zusätzlichen Vorteil, dass Sie nicht die Fehlermeldung "Befehlszeile zu lang" erhalten, wenn Sie Tausende von Dateien haben, da diese printfnicht als separater Prozess ausgeführt werden.
Adrian Pronk
2
@AdrianPronk, ja, außer in Shells, in denen printfnicht wie eingebaut pdkshund einige seiner Ableitungen oder die meisten Versionen der Bourne-Shell. Ein Nachteil im Vergleich zu ls -dist, dass, wenn sich keine nicht versteckte Datei darin befindet, sie gedruckt wird, /path/to/*während lsSie einen Fehler über diese Datei erhalten, die stattdessen nicht existiert.
Stéphane Chazelas
10

Um nur normale Dateien zu sehen -

find "$PWD" -type f  > output
jai_s
quelle
3

Sie können einfach realpathoder readlink:

ls | xargs realpath
  • xargs Erstellen und Ausführen von Befehlszeilen über die Standardeingabe.
  • realpath: gibt den kanonisierten absoluten Pfadnamen zurück
  • readlink: Wert eines symbolischen Links lesen
Pablo A
quelle
realpath: Befehl nicht gefunden
Rogerdpack
@ Rogerdpack Haben Sie Coreutils- Paket installiert? Ich bekomme diese Info mit dpkg -S /usr/bin/realpath. Schauen Sie sich das an .
Pablo A
3

Ein anderer Weg , mit tree, die hier nicht erwähnt, geht es rekursiv und im Gegensatz zu finden oder ls Sie haben keine Fehler (wie: Permission denied, Not a directory) auch den absoluten Pfad für den Fall bekommen Sie die Dateien füttern xargsoder anderen Befehl

tree -fai /pathYouWantToList >listOfFiles.list

Die Optionen bedeuten:

-a     All  files  are  printed.  By default tree does not print hidden files (those beginning with a dot
       `.').  In no event does tree print the file system constructs `.'  (current  directory)  and  `..'
       (previous directory).

-i     Makes tree not print the indentation lines, useful when used in conjunction with the -f option.

-f     Prints the full path prefix for each file.

So installieren Sie tree:

sudo apt install tree auf Ubuntu / Debian

sudo yum install tree auf CentOS / Fedora

sudo zypper install tree unter OpenSUSE

Eduard Florinescu
quelle
1
Baum: Befehl nicht gefunden
Rogerdpack
@ Rogerdpack sudo apt install treeunter Ubuntu sudo yum install treeunter CentOS sudo zypper install treeunter OpenSUSE
Eduard Florinescu
1
brew install treeauf Mac
oOEric
2

In einer früheren Linux-Umgebung hatte ich einen resolveBefehl, der Pfade standardisierte, einschließlich der Umwandlung eines relativen Pfades in einen absoluten Pfad. Ich kann es jetzt nicht finden, also wurde es vielleicht von jemandem in dieser Organisation geschrieben.

Sie können Ihr eigenes Skript mit Funktionen in den Python- oder Perl-Standardbibliotheken (und wahrscheinlich auch in anderen Sprachen) erstellen.

resolve.py :

#!/bin/env python

import sys
import os.path

for path in sys.argv:
    print os.path.abspath(path)

resolve.pl :

#!/bin/env perl

use warnings;
use Cwd qw ( abs_path );

foreach (@ARGV) {
    print abs_path($_), "\n";
}

Dann würden Sie Ihr Problem lösen mit:

resolve.py * > listOfFiles.list

Mit diesem Befehl können Sie auch Folgendes ausführen:

cd /root/dir1/dir2/dir3
resolve.py ../../dir4/foo.txt
# prints /root/dir1/dir4/foo.txt
jskroch
quelle