web-dev-qa-db-fra.com

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

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?

33
arabian_albert
ls -d "$PWD"/* > listOfFiles.list
32
Comforse

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.

35
Andy Dalton

Notez que dans:

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

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

printf '%s\n' "$PWD"/*
13

Pour voir uniquement les fichiers normaux -

find "$PWD" -type f  > output
10
jai_s

Une autre façon avec tree, non mentionnée ici, elle va récursivement et contrairement à find ou ls vous n'avez aucune erreur (comme: Permission denied, Not a directory) vous obtenez également le chemin absolu au cas où vous voudriez alimenter les fichiers vers xargs ou 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

3
Eduard Florinescu

Vous pouvez simplement utiliser realpath ou 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
3
Pablo A

Dans un ancien environnement Linux, j'avais une commande resolve qui normaliserait les chemins, y compris en faisant 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 des fonctions dans les 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
2
jskroch