Bir dizindeki tüm dosyalar mutlak yollarla nasıl listelenir


30

Bir dizindeki her dosyanın mutlak yolunu içeren bir dosyaya (tercihen bir liste dosyası) ihtiyacım var.

Örnek dir1: file1.txt file2.txt file3.txt

listOfFiles.list:

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

Bunu linux / mac'ta nasıl yapabilirim?

Yanıtlar:


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

Bu kırmızı şapka linux içinde işe yarar mı?
arabian_albert

4
Bu komut herhangi bir Linux veya UNIX işletim sisteminde çalışır. Satır başına bir dosya almak istiyorsanız, kullanmanız gerekirls -d -1 $PWD/*
MelBurslan

1
dosya adlarınız uzunsa veya terminal genişliği darsa, evet, durum böyle olacak, ancak tüm ekranı kaplayacak şekilde terminal penceresini en üst düzeye çıkardığınızı veya dosya adlarınızın (yol dahil) gerçekten kısa olduğunu, doğru. -1seçenek, satır başına bir dosya adı almanızı garanti eder
MelBurslan

7
@MelBurslan'ın eklenmesi yalnızca çıktı bir sonlandırma için gerekliyse gereklidir. lsçıktının bir dosyaya veya terminale olup olmadığını tespit eder.
Runium

9
Bu, dizinde binlerce dosya varsa, yani maksimum komut satırı boyutunu aşmaya yetecek kadar olursa (kabuğun dosya adlarını tam yolla genişletmesi daha olasıdır) başarısız olur. @Andy Dalton'un findcevabı daha iyi bir çözümdür, çünkü kaç dosya listelenecek olursa olsun başarısız olmayacaktır.
Cas

33

Bul'u kullanabilirsiniz. Yalnızca normal dosyalar istediğinizi varsayarak şunları yapabilirsiniz:

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

Diğer dosya türlerini istiyorsanız type parametresini uygun şekilde ayarlayabilirsiniz.


7
Daha geleceğe yönelik bir çözümü işaret etmek için +1 ls. Bu find, alt dizinleri yineler, özyinelemeli olmayan -maxdepth 1önce -typeargüman eklemeniz gerekir .
kubanczyk

@AndyDalton Bash'ta bir dizi aynı olsun
Kasun Siyambalapitiya

13

Şuna dikkat edin:

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

Dizindeki (gizli olmayan) dosyaların listesini hesaplayan ve listeye ileten kabuktur ls. lssadece bu listeyi burada yazdırır, böylece yapabilecekleriniz:

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

3
Kullanımı printfgibi dosyaların binlerce varsa 'çok uzun komut satırını' hatası bir almazsınız avantaj olan printfayrı bir süreç olarak çalıştırmak değildir.
Adrian Pronk

2
@AdrianPronk, evet, printfaynı şekilde yerleşik olmayan kabuklar pdkshve türevlerinin bir kısmı veya Bourne kabuğunun çoğu versiyonu hariç . Bunun bir dezavantajı ls -d, orada gizli olmayan bir dosya bulunmaması durumunda, mevcut olmayan dosyayla ilgili bir hata vereceği /path/to/*sırada yazdırılacağıdır ls.
Stéphane Chazelas 10:16

10

Sadece düzenli dosyaları görmek için -

find "$PWD" -type f  > output


3

Başka ile yolu tree: değil o yinelemeli, burada gider söz ve aksine bulmak veya ls (gibi herhangi bir hata yok Permission denied, Not a directorysen dosyaları beslemek istiyorum ayrıca durumda mutlak yolunu almak) xargsveya diğer komut

tree -fai /pathYouWantToList >listOfFiles.list

seçenekler anlamı:

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

Yüklemek için tree:

sudo apt install tree Ubuntu / Debian'da

sudo yum install tree CentOS / Fedora hakkında

sudo zypper install tree OpenSUSE’de


1
tree: komut bulunamadı
rogerdpack 23:18

@rogerdpack sudo apt install treeUbuntu sudo yum install treeCentOS üzerinde sudo zypper install treeOpenSUSE üzerinde
Eduard Florinescu

1
brew install treeMac üzerinde
oOEric

2

Geçmiş bir Linux ortamında, resolvemutlak bir yola göreceli bir yol yapmak da dahil olmak üzere yolları standartlaştıracak bir emir aldım . Şimdi bulamıyorum, belki de o organizasyondaki biri tarafından yazılmıştır.

Python veya Perl standart kütüphanelerindeki (ve muhtemelen diğer dillerdeki) fonksiyonları kullanarak kendi betiğinizi yapabilirsiniz.

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

O zaman sorununuzu şununla çözersiniz:

resolve.py * > listOfFiles.list

Bu komutla bunun gibi şeyleri de yapabilirsiniz:

cd /root/dir1/dir2/dir3
resolve.py ../../dir4/foo.txt
# prints /root/dir1/dir4/foo.txt
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.