Jak wyświetlić listę wszystkich plików w katalogu ze ścieżkami bezwzględnymi

30

Potrzebuję pliku (najlepiej pliku .list), który zawiera bezwzględną ścieżkę każdego pliku w katalogu.

Przykład dir1: plik1.txt plik2.txt plik3.txt

listOfFiles.list:

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

Jak mogę to zrobić w systemie Linux / Mac?

arabian_albert
źródło

Odpowiedzi:

30
ls -d "$PWD"/* > listOfFiles.list
Comforse
źródło
czy to zadziała w Red Hat Linux?
arabian_albert
4
To polecenie działa w dowolnym systemie operacyjnym Linux lub UNIX. Jeśli chcesz uzyskać jeden plik na linię, musisz użyćls -d -1 $PWD/*
MelBurslan
1
jeśli twoje nazwy plików są długie lub szerokość terminala jest wąska ,, tak, tak będzie, ale powiedz, że zmaksymalizowałeś okno terminala, aby zajmowało cały ekran, lub twoje nazwy plików (w tym ścieżki) są naprawdę krótkie, to nie wytrzyma prawdziwe. -1opcja gwarantuje, że otrzymasz jedną nazwę pliku w wierszu
MelBurslan,
7
Dodanie @MelBurslan jest potrzebne tylko wtedy, gdy wyjście jest przesyłane do terminala. lswykrywa, czy wyjście jest do pliku lub terminala.
Runium
9
to się nie powiedzie, jeśli w katalogu znajduje się wiele tysięcy plików, tj. wystarczająco dużo, aby przekroczyć maksymalny rozmiar wiersza poleceń (bardziej prawdopodobne, że powłoka rozwija nazwy plików z pełną ścieżką). Odpowiedź Andy'ego Daltona findjest lepszym rozwiązaniem, ponieważ nie zawiedzie, bez względu na to, ile plików ma być na liście.
cas
33

Możesz użyć find. Zakładając, że chcesz tylko zwykłe pliki, możesz:

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

Możesz odpowiednio dostosować parametr type, jeśli chcesz innych typów plików.

Andy Dalton
źródło
7
+1 za wskazanie bardziej przyszłościowego rozwiązania, które ls. Powoduje findto rekurencję podkatalogów, dla nierekurencyjnych należy dodać argument -maxdepth 1przed -type.
kubańczyk
@AndyDalton Jak dostać to samo do tablicy w bash
Kasun Siyambalapitiya
13

Uwaga: w:

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

Jest to powłoka, która oblicza listę (nie ukrytych) plików w katalogu i przekazuje listę do ls. lspo prostu drukuje tę listę tutaj, abyś mógł równie dobrze:

printf '%s\n' "$PWD"/*
Stéphane Chazelas
źródło
3
Korzystanie printfma dodatkową zaletę, że nie pojawi się błąd „zbyt długiej linii poleceń”, jeśli masz tysiące plików, ponieważ printfnie jest uruchamiany jako osobny proces.
Adrian Pronk
2
@AdrianPronk, tak, z wyjątkiem powłok, w których printfnie jest wbudowany jak pdkshi niektórych jego pochodnych lub większości wersji powłoki Bourne'a. Jedną wadą w porównaniu do ls -dtego jest to, że jeśli nie ma tam nie ukrytego pliku, zostanie wydrukowany, /path/to/*a lszamiast tego wyświetlony zostanie komunikat o błędzie.
Stéphane Chazelas,
10

Aby zobaczyć zwykłe pliki -

find "$PWD" -type f  > output
jai_s
źródło
3

Możesz po prostu użyć realpathlub readlink:

ls | xargs realpath
  • xargs buduj i wykonuj wiersze poleceń ze standardowego wejścia.
  • realpath: zwraca kanoniczną bezwzględną nazwę ścieżki
  • readlink: odczyt wartości dowiązania symbolicznego
Pablo A.
źródło
realpath: nie znaleziono polecenia
rogerdpack
@rogerdpack czy masz zainstalowany pakiet coreutils ? Dostaję te informacje z dpkg -S /usr/bin/realpath. Sprawdź to .
Pablo A
3

Innym sposobem, ze treenie tu wspomniano, przechodzi rekurencyjnie iw przeciwieństwie do znalezienia lub ls nie masz żadnych błędów (takich jak: Permission denied, Not a directory) można również uzyskać bezwzględną ścieżkę w przypadku, gdy chcesz karmić plików xargslub innych poleceń

tree -fai /pathYouWantToList >listOfFiles.list

opcje oznaczają:

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

Żeby zainstalować tree :

sudo apt install tree na Ubuntu / Debian

sudo yum install tree na CentOS / Fedora

sudo zypper install tree na OpenSUSE

Eduard Florinescu
źródło
1
drzewo: nie znaleziono polecenia
rogerdpack
@rogerdpack sudo apt install treena Ubuntu sudo yum install treena CentOS sudo zypper install treena OpenSUSE
Eduard Florinescu
1
brew install treena Macu
oOEric
2

W poprzednim środowisku Linuksa miałem resolve polecenie standaryzujące ścieżki, w tym przekształcenie ścieżki względnej w ścieżkę bezwzględną. Nie mogę go teraz znaleźć, więc może został napisany przez kogoś z tej organizacji.

Możesz stworzyć własny skrypt za pomocą funkcji w standardowych bibliotekach Python lub Perl (i prawdopodobnie także w innych językach).

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

Następnie rozwiążesz swój problem z:

resolve.py * > listOfFiles.list

Za pomocą tego polecenia możesz także wykonywać takie czynności:

cd /root/dir1/dir2/dir3
resolve.py ../../dir4/foo.txt
# prints /root/dir1/dir4/foo.txt
jskroch
źródło