Cara daftar semua file dalam direktori dengan jalur absolut

30

Saya memerlukan file (sebaiknya file .list) yang berisi path absolut dari setiap file dalam direktori.

Contoh dir1: file1.txt file2.txt file3.txt

listOfFiles.list:

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

Bagaimana saya bisa melakukan ini di linux / mac?

arabian_albert
sumber

Jawaban:

30
ls -d "$PWD"/* > listOfFiles.list
Comforse
sumber
apakah ini akan bekerja di linux red hat?
arabian_albert
4
Perintah yang bekerja di setiap sistem operasi Linux atau UNIX. Jika Anda ingin mendapatkan satu file per baris, Anda perlu menggunakanls -d -1 $PWD/*
MelBurslan
1
jika nama file Anda panjang atau lebar terminal sempit ,, ya, itu akan terjadi, tetapi katakan Anda memaksimalkan jendela terminal untuk menempati seluruh layar atau nama file Anda (termasuk jalur) benar-benar pendek, yang tidak akan tahan benar. -1opsi menjamin Anda mendapatkan satu nama file per baris
MelBurslan
7
Tambahan @MelBurslan hanya diperlukan jika output ke termiinal. lsmendeteksi apakah output ke file atau terminal.
Runium
9
ini akan gagal jika ada ribuan file dalam direktori, yaitu cukup untuk melebihi ukuran baris perintah maksimum (dibuat lebih mungkin oleh fakta bahwa shell memperluas nama file dengan path lengkap). @Andy Dalton findjawaban adalah solusi yang lebih baik, karena tidak akan gagal tidak peduli berapa banyak file yang akan terdaftar.
cas
33

Anda dapat menggunakan find. Dengan asumsi bahwa Anda hanya menginginkan file biasa, Anda dapat melakukan:

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

Anda dapat menyesuaikan parameter tipe yang sesuai jika Anda ingin jenis file lainnya.

Andy Dalton
sumber
7
+1 untuk menunjuk solusi yang lebih tahan-masa depan itu ls. Ini findtidak mengulangi subdirektori, untuk non-rekursif Anda perlu menambahkan -maxdepth 1sebelum -typeargumen.
kubanczyk
@AndyDalton Bagaimana cara mendapatkan yang sama ke array di bash
Kasun Siyambalapitiya
13

Perhatikan bahwa di:

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

Shell yang menghitung daftar file (tidak tersembunyi) di direktori dan meneruskan daftar ls. lscukup cetak daftar itu di sini, jadi Anda juga bisa:

printf '%s\n' "$PWD"/*
Stéphane Chazelas
sumber
3
Menggunakan printfmemiliki bonus tambahan bahwa Anda tidak akan mendapatkan kesalahan 'command line terlalu lama' jika Anda memiliki ribuan file karena printftidak dijalankan sebagai proses terpisah.
Adrian Pronk
2
@AdrianPronk, ya, kecuali di shell printfyang tidak built-in seperti pdkshdan beberapa turunannya atau sebagian besar versi shell Bourne. Satu kekurangan dibandingkan dengan ls -dadalah bahwa jika tidak ada file yang tidak disembunyikan di sana, itu akan mencetak /path/to/*sementara lsakan memberi Anda kesalahan tentang file yang tidak ada.
Stéphane Chazelas
10

Untuk melihat file biasa -

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

Anda bisa menggunakan realpathatau readlink:

ls | xargs realpath
  • xargs membangun dan mengeksekusi baris perintah dari input standar.
  • realpath: mengembalikan pathname absolut yang dikanonikalisasi
  • readlink: nilai baca tautan simbolik
Pablo A
sumber
realpath: command not found
rogerdpack
@rogerdpack apakah Anda memiliki paket coreutils yang diinstal? Saya mendapatkan info itu dengan dpkg -S /usr/bin/realpath. Lihat ini .
Pablo A
3

Cara lain dengan tree, tidak disebutkan di sini, itu berjalan secara rekursif dan tidak seperti menemukan atau ls Anda tidak memiliki kesalahan (seperti: Permission denied, Not a directory) Anda juga mendapatkan path absolut jika anda ingin memberi makan file ke xargsatau perintah lain

tree -fai /pathYouWantToList >listOfFiles.list

arti opsi:

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

Untuk menginstal tree:

sudo apt install tree di Ubuntu / Debian

sudo yum install tree pada CentOS / Fedora

sudo zypper install tree pada OpenSUSE

Eduard Florinescu
sumber
1
tree: command not found
rogerdpack
@rogerdpack sudo apt install treedi Ubuntu sudo yum install treepada CentOS sudo zypper install treedi OpenSUSE
Eduard Florinescu
1
brew install treepada Mac
oOEric
2

Di lingkungan Linux yang lalu, saya memiliki resolveperintah yang akan membakukan jalur, termasuk membuat jalur relatif menjadi jalur absolut. Saya tidak dapat menemukannya sekarang, jadi mungkin itu ditulis oleh seseorang di organisasi itu.

Anda dapat membuat skrip sendiri menggunakan fungsi di pustaka standar Python atau Perl (dan mungkin bahasa lain juga).

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

Kemudian, Anda akan memecahkan masalah Anda dengan:

resolve.py * > listOfFiles.list

Dengan perintah ini, Anda juga dapat melakukan hal-hal seperti ini:

cd /root/dir1/dir2/dir3
resolve.py ../../dir4/foo.txt
# prints /root/dir1/dir4/foo.txt
Jskroch
sumber