web-dev-qa-db-fra.com

Répertorie les fichiers de manière récursive dans la CLI Linux avec le chemin relatif au répertoire en cours

Ceci est similaire à cette question , mais je veux inclure le chemin relatif au répertoire actuel sous Unix. Si je fais ce qui suit:

ls -LR | grep .txt

Cela n'inclut pas les chemins complets. Par exemple, j'ai la structure de répertoire suivante:

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

Le code ci-dessus retournera:

file.txt
file1.txt
file2.txt

Comment puis-je l'obtenir pour inclure les chemins relatifs au répertoire actuel à l'aide de commandes Unix standard?

213
Darryl Hein

Utilisez find:

find . -name \*.txt -print

Sur les systèmes qui utilisent GNU find, comme la plupart des distributions GNU/Linux, vous pouvez omettre le caractère print.

290
Andru Luvisi

Utilisez tree, avec -f (chemin complet) et -i (pas de lignes d'indentation):

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

Vous pouvez ensuite utiliser grep pour filtrer ceux que vous voulez.


Si la commande est introuvable, vous pouvez l'installer:

Tapez la commande suivante pour installer la commande tree sur RHEL/CentOS et Fedora linux:

# yum install tree -y

Si vous utilisez Debian/Ubuntu, Mint Linux entrez la commande suivante dans votre terminal:

$ Sudo apt-get install tree -y
70
Stephen Irons

Essayez find. Vous pouvez le rechercher exactement dans la page de manuel, mais c'est un peu comme ceci:

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

donc pour votre exemple

find . -name "*.txt"

devrait vous donner ce que vous voulez.

25
Sam Hoice

Vous pouvez utiliser find à la place:

find . -name '*.txt'
9
Sherm Pendley

Cela fait le tour:

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

Mais il le fait en "péchant" avec l'analyse syntaxique de ls, ce qui est considéré comme une mauvaise forme par les communautés GNU et Ghostscript.

5
El Guesto
DIR=your_path
find $DIR | sed 's:""$DIR""::'

'sed' effacera 'your_path' de tous les résultats 'trouver'. Et vous recevez par rapport au chemin 'DIR'.

4
h-dima

Pour obtenir les noms de fichier de chemin complet des fichiers souhaités à l'aide de la commande find, utilisez-le avec la commande pwd:

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

Recherchez le fichier appelé "nom de fichier" sur votre système de fichiers en démarrant la recherche à partir du répertoire racine "/". Le "nom de fichier"

find / -name "filename" 
1
user2101432

Vous pouvez créer une fonction Shell, par exemple dans votre .zshrc ou .bashrc:

filepath() {
    echo $PWD/$1
}

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

Le premier ne fonctionnerait que sur des fichiers uniques, évidemment.

1
rxw

Voici un script Perl:

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

usage:

ls -LR | Perl format_ls-LR.pl
1
Eric Keller

Dans le shell poisson , vous pouvez le faire pour répertorier tous les fichiers PDF de manière récursive, y compris ceux du répertoire en cours:

$ ls **pdf

Supprimez simplement 'pdf' si vous voulez des fichiers de tout type.

1
rien333

Si vous souhaitez conserver les détails fournis avec ls, tels que la taille du fichier, etc. dans votre sortie, cela devrait fonctionner.

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

Vous pouvez implémenter cette fonctionnalité comme ceci
Premièrement, l’utilisation de la commande ls a indiqué le répertoire ciblé. Plus tard, en utilisant la commande find filtrer le résultat. Cela ressemble à votre cas - le nom du fichier commence toujours par Word file***.txt

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