Comment lister tous les fichiers d'un répertoire avec des chemins absolus

30

J'ai besoin d'un fichier (de préférence un fichier .list) qui contient le chemin absolu de chaque fichier d'un répertoire.

Exemple dir1: file1.txt file2.txt file3.txt

listOfFiles.list:

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

Comment puis-je accomplir cela sous linux / mac?

arabian_albert
la source

Réponses:

30
ls -d "$PWD"/* > listOfFiles.list
Comforse
la source
cela fonctionnerait-il dans Red Hat Linux?
arabian_albert
4
Cette commande fonctionne dans n'importe quel système d'exploitation Linux ou UNIX. Si vous voulez obtenir un fichier par ligne, vous devez utiliserls -d -1 $PWD/*
MelBurslan
1
si vos noms de fichiers sont longs ou la largeur du terminal est étroite, oui, ce sera le cas, mais disons que vous avez maximisé la fenêtre du terminal pour occuper tout l'écran ou que vos noms de fichiers (y compris le chemin) sont vraiment courts, cela ne tiendra pas vrai. -1option garantit que vous obtenez un nom de fichier par ligne
MelBurslan
7
L'addition de @MelBurslan n'est nécessaire que si la sortie est vers une borne. lsdétecte si la sortie est vers un fichier ou un terminal.
Runium
9
cela échouera s'il y a plusieurs milliers de fichiers dans le répertoire, c'est-à-dire suffisamment pour dépasser la taille maximale de la ligne de commande (rendue plus probable par le fait que le shell développe les noms de fichiers avec un chemin complet). La findréponse de @Andy Dalton est une meilleure solution, car elle n'échouera pas, quel que soit le nombre de fichiers à répertorier.
cas
33

Vous pouvez utiliser find. En supposant que vous ne souhaitiez que des fichiers normaux, vous pouvez faire:

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

Vous pouvez ajuster le paramètre de type selon vos besoins si vous souhaitez d'autres types de fichiers.

Andy Dalton
la source
7
+1 pour avoir indiqué une solution plus évolutive ls. Cela findrécursive les sous-répertoires, pour les non récursifs, vous devez ajouter -maxdepth 1avant l' -typeargument.
kubanczyk
@AndyDalton Comment obtenir la même chose dans un tableau en bash
Kasun Siyambalapitiya
13

Notez que dans:

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

C'est le shell qui calcule la liste des fichiers (non cachés) dans le répertoire et transmet la liste à ls. lsimprime simplement cette liste ici, vous pouvez donc aussi bien faire:

printf '%s\n' "$PWD"/*
Stéphane Chazelas
la source
3
L'utilisation printfa l'avantage supplémentaire que vous n'obtiendrez pas une erreur de «ligne de commande trop longue» si vous avez des milliers de fichiers car elle printfn'est pas exécutée en tant que processus distinct.
Adrian Pronk
2
@AdrianPronk, oui, sauf dans les shells où printfn'est pas intégré comme pdkshet certains de ses dérivés ou la plupart des versions du shell Bourne. Un inconvénient par rapport à ls -dest que s'il n'y a pas de fichier non caché, il s'imprimera /path/to/*alors que lsvous donnera une erreur sur ce fichier qui n'existe pas à la place.
Stéphane Chazelas
10

Pour voir uniquement les fichiers normaux -

find "$PWD" -type f  > output
jai_s
la source
3

Vous pouvez simplement utiliser realpathou readlink:

ls | xargs realpath
  • xargs construire et exécuter des lignes de commande à partir de l'entrée standard.
  • realpath: retourne le chemin absolu canonisé
  • readlink: lire la valeur d'un lien symbolique
Pablo A
la source
realpath: commande introuvable
rogerdpack
@rogerdpack avez-vous installé le paquet coreutils ? Je reçois cette information avec dpkg -S /usr/bin/realpath. Regardez ça .
Pablo A
3

Une autre façon avec tree, non mentionné ici, il va récursive et trouver la différence ou ls vous n'avez pas des erreurs (comme: Permission denied, Not a directory) vous obtenez également le chemin absolu dans le cas où vous voulez nourrir les fichiers xargsou une autre commande

tree -fai /pathYouWantToList >listOfFiles.list

les options signifiant:

-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.

Pour installer tree:

sudo apt install tree sur Ubuntu / Debian

sudo yum install tree sur CentOS / Fedora

sudo zypper install tree sur OpenSUSE

Eduard Florinescu
la source
1
tree: commande introuvable
rogerdpack
@rogerdpack sudo apt install treesur Ubuntu sudo yum install treesur CentOS sudo zypper install treesur OpenSUSE
Eduard Florinescu
1
brew install treesur Mac
oOEric
2

Dans un ancien environnement Linux, j'avais une resolvecommande qui normalisait les chemins, y compris la transformation d'un chemin relatif en chemin absolu. Je ne le trouve pas maintenant, alors peut-être qu'il a été écrit par quelqu'un dans cette organisation.

Vous pouvez créer votre propre script en utilisant les fonctions des bibliothèques standard Python ou Perl (et probablement aussi d'autres langages).

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";
}

Ensuite, vous résoudriez votre problème avec:

resolve.py * > listOfFiles.list

Avec cette commande, vous pouvez également faire des choses comme ceci:

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