Linux'ta mutlak yollarıyla dosyaların bir listesini nasıl oluşturabilirim?


304

Dosya yollarını girdi olarak alan bir kabuk komut dosyası yazıyorum.

Bu nedenle, tam yollarla özyinelemeli dosya listeleri oluşturmam gerekiyor. Örneğin, dosyanın baryolu:

/home/ken/foo/bar

ama, bildiğim kadarıyla gördüğünüz gibi, hem lsve findyalnızca göreli yolu listeleri vermek:

./foo/bar   (from the folder ken)

Bu bariz bir gereksinimi gibi görünüyor, ama ben bir şey göremiyorum findya lsman sayfaları.

Mutlak yolları da dahil olmak üzere kabuktaki dosyaların listesini nasıl oluşturabilirim?


kullanım:find /home/ken/foo/bar -exec ls -ld $PWD/{} \;
Öğrenci

Yanıtlar:


305

findBaşlamak için mutlak bir yol verirseniz , mutlak yollar yazdırılır. Örneğin, geçerli dizindeki tüm .htaccess dosyalarını bulmak için:

find "$(pwd)" -name .htaccess

veya kabuğunuz $PWDgeçerli dizine genişliyorsa :

find "$PWD" -name .htaccess

find dosyaya göreli bir yola verilen yolu, bu yoldan ekler.

Greg Hewgillpwd -P , mevcut dizininizdeki sembolik bağlantıları çözmek istiyorsanız da kullanmanızı önerdi .


9
Not ayrıca çözmek sembolik kullanım istiyorsanız o pwd -P.
Greg Hewgill

5
Bu yararlı, ama user431529 aşağıdaki yanıtı daha geçerli olduğunu düşünüyorum: ls -d -1 $PWD/**/*ama find $PWDaynı zamanda çalışır (bash test)
Brian

9
@Brian Neden? find $PWDbasit. lsBüyü (bunu diğer ad sürece) karmaşık ve denetimi zordur. findkabuk glob genişlemelerine bağlı değildir, bu yüzden herhangi bir kabukta çalışır. findayrıca çok daha esnektir, tüm dosyaların veya belki de tüm dizinlerin özyinelemeli bir listesini alabilirim, ya da belki de tüm xml dosyalarının bir listesini veya geçen hafta değiştirilen tüm dosyaları istiyorum. Tüm bunlar mümkün find, ancak kolay değil ls.
Matthew Scharley

12
find "`pwd`" -name .htaccessDizin adlarındaki boşluklar nedeniyle kullanmak zorunda kaldım
Paulo Casaretto

Anlamadım, bu komut bana I dosyasının mutlak yolunu vermiyor, listedeki diğer cevaplar işi yapıyor.
Bjørn Otto Vasbotten

203
readlink -f filename 

tam mutlak yolu verir. ancak dosya bir symlink ise, nihai çözümlenmiş adı alırsınız.


8
Güzel. Readlink (yani Mac) BSD Varyant üzerinde çalışmaz.Mac üzerinde gnucoreutils kullanın. Ve böylece yukarıdaki çözüm ile çalışan greadlink kullanabilirsiniz.
sheki

12
Mac OS X'e gitme
Andrew Lazarus

1
@AndrewLazarus - Mac OS X için, realpathbunun yerine kullanın
cz

Eğer bash araçlarını kurarsanız brew install coreutils, yürütülebilir dosya olarak yüklenir/usr/local/opt/coreutils/libexec/gnubin/readlink
redolent

121

Bunu dirs için kullanın ( /after **, dizinlerle sınırlamak için bash'de gereklidir):

ls -d -1 "$PWD/"**/

bu, isimleri aşağıdakileri içeren doğrudan geçerli dizinin altındaki dosyalar ve dizinler için .:

ls -d -1 "$PWD/"*.*

bu her şey için:

ls -d -1 "$PWD/"**/*

Buradan alınmıştır http://www.zsh.org/mla/users/2002/msg00033.html

Bash'da, **etkinleştirirseniz özyinelemelidir shopt -s globstar.


1
ls -d -1 $ PWD / ** / * geçerli değildir. + 1'imi geri alabilsem. Yine de gitmeniz gereken her derinlik için ** yapabilirsiniz.
user606723

4
** operatörü, özyinelemeli bir globbing operatörüdür. Komutu, onu destekleyen bir kabukta (zsh gibi) kullanırsanız, düzgün çalışır.
zebediah49

ls -d1 "$ PWD /"{*,.*} da gizli (nokta) dosyaları yakalamak için. Benim için yanıttaki özyinelemeli sürüm, alt klasörlerdeki dosyalara mutlak yolu eklemedi.
Zael

Ben bul kullanmalıyım sanırım ... Ben -> bash: / bin / ls: Bağımsız değişken listesi çok uzun
TelamonAegisthus

30

Kullanabilirsiniz

find $PWD 

bashta


3
Bu, geçerli dizinin yolunu ve altındaki tüm dosyaları ve dizinleri de verecektir. Muhtemelen insanların aradığı bu değil.
Bill

18
ls -d "$PWD/"*

Bu yalnızca geçerli dizine bakar . Boşluk içermesi durumunda "$ PWD" ifadesini kullanır.


Bu hala çok geçerli bir cevap, ancak bunun tekrar tekrar çalışmadığı bilgisini eklemek iyi olurdu (aslında aradığım şey bu!)
bbbco

1
Özyinelemeli kullanım için: bulun. -exec ls -ld $ PWD / {} \;
Öğrenci

10

Komut: ls -1 -d "$PWD/"*

Bu, aşağıdaki gibi dosyanın mutlak yollarını verecektir.

[root@kubenode1 ssl]# ls -1 -d "$PWD/"*
/etc/kubernetes/folder/file-test-config.txt
/etc/kubernetes/folder/file-test.txt
/etc/kubernetes/folder/file-client.txt

8

$PWDYukarıdaki Matta tarafından iyi bir seçenektir. Yalnızca dosyaları yazdırmak istiyorsanız, yalnızca normal dosyaları aramak için -type f seçeneğini de ekleyebilirsiniz. Diğer seçenekler sadece dizinler vb. İçin "d" dir. Yani sizin durumunuzda (eğer sadece .c ext uzantılı dosyaları aramak isterseniz):

find $PWD -type f -name "*.c" 

veya tüm dosyaları istiyorsanız:

find $PWD -type f

Not: Yukarıdaki komut için bir takma ad oluşturamazsınız, çünkü takma ad bash tarafından ayarlanırken $ PWD ana dizininize otomatik olarak tamamlanır.


Aslında, -d yalnızca dizinler anlamına gelmez; dosyalara dizinleri işlemesi anlamına gelir. Yani eğer ls -d / home, geri "/ home" alırsınız, ne / home ne bir liste.
Travis

@Travis: Bulma seçeneğinden bahsediyordu, ls değil. Onun durumunda "find / -type d" sadece dizinleri bulur - dedi.
oligofren

6

Find komutuna mutlak bir yol verirseniz, sonuçları mutlak bir yolla tükürür. Eğer Ken dizininden yazacaksanız:

find /home/ken/foo/ -name bar -print    

(göreli yol yerine find . -name bar -print)

Şunları elde etmelisiniz:

/home/ken/foo/bar

Bu nedenle, bir istiyorsanız ls -lve mutlak yolu döndürmesini istiyorsanız, find komutuna ls -lbulduğu her şeyi bir çalıştırmasını söyleyebilirsiniz .

find /home/ken/foo -name bar -exec ls -l {} ;\ 

NOT: {}ve arasında bir boşluk vardır;

Bunun gibi bir şey elde edersiniz:

-rw-r--r--   1 ken admin       181 Jan 27 15:49 /home/ken/foo/bar

Dosyanın nerede olduğundan emin değilseniz, arama konumunu istediğiniz zaman değiştirebilirsiniz. Arama yolu "/" ile başladığı sürece, mutlak bir yol elde edersiniz. Çok sayıda izin reddedildi hatası alacağınız bir konum (/ / gibi) arıyorsanız, sonuçları bulmak için standart hatayı yeniden yönlendirmenizi öneririm:

find / -name bar -exec ls -l {} ;\ 2> /dev/null

( 2>Borne ve Bash kabuklarının sözdizimidir, ancak C kabuğu ile çalışmaz. Diğer kabuklarda da işe yarayabilir, ancak sadece Bourne ve Bash'da çalıştığından eminim).


İle aynı lsişleme birden fazla argüman iletebilirsiniz -exec ls -ld {} +. (Muhtemelen liste dizini içeriğine -dsahip olmak istemezsiniz ls). Ya da daha kullanın bulmak yerleşik oluyor lsile find ... name bar -ls. Ayrıca, komut başına bir arg için sözdizimi yanlıştır: Kabuktan noktalı virgül belirtmeniz gerekir, bu yüzden {} \;.
Peter Cordes

5

fd

fd(Yerine find) kullanarak aşağıdaki sözdizimini kullanın:

fd . foo -a

.Arama modeli ve fookök dizini nerede .

Örneğin tüm dosyaları listelemek için etcyinelemeli kaçak: fd . /etc -a.

-a, --absolute-path Göreli yollar yerine mutlak göster


3

Sadece bir alternatif

ls -d "$PWD/"* 

*kabuk genişlemesi olduğunu saptamak için

echo "$PWD/"*

aynısını yapacaktır ( -1boşluklarla değil, yeni satırlarla ayırmak için kullanamayacağınız dezavantaj ).


bunun hakkında daha fazla ayrıntı verebilir misiniz? mermi açılımı nedir? -1satırlarla ayırmak için nasıl kullanılır ?
Antonio Araujo

@Antonio Araujo, kabuk genişletme kabuk (örn. Bash) * ile dosya listesi yerini alacak - bash man sayfasında daha fazla okuyabilirsiniz. -1 ls komut seçeneğidir, echo diğer komuttur, aynı seçeneklere sahip değildir.
Marisha

1
lspwd() { for i in $@; do ls -d -1 $PWD/$i; done }

1

Bir listeyi fazladan bir süre yazmadan yazdırıp bir dosya eşleşmesinin nasıl aranacağını gösteren bir örnek. Bu yardımcı olur umarım:

find . -type f -name "extr*" -exec echo `pwd`/{} \; | sed "s|\./||"

1

Bu benim için çalıştı. Ancak alfabetik sıraya göre listelenmedi.

find "$(pwd)" -maxdepth 1

Bu komut alfabetik olarak ve gizli dosyaları da listeler.

ls -d -1 "$PWD/".*; ls -d -1 "$PWD/"*;

1

stat

Tek bir dosyanın mutlak yolu:

stat -c %n "$PWD"/foo/bar

1

Bunu denemek isteyebilirsiniz.

for name in /home/ken/foo/bar/*
do
    echo $name
done

Eğer fordöngü kullanarak ve echosadece olmadan abs yolu alabilirsiniz find.


1

Mevcut ve alt dizinlerdeki tüm dosyaların listesine ihtiyacınız varsa

find $PWD -type f

Yalnızca geçerli dizindeki tüm dosyaların listesine ihtiyacınız varsa

find $PWD -maxdepth 1 -type f

0

Bu kurallı yolu verecektir (sembolik bağlantıları çözecektir): realpath FILENAME

Symlink'in kendisine kanonik yol istiyorsanız, o zaman: realpath -s FILENAME


0

Önerilen yöntemlerin tümü olmasa bile, yol boşluk içeriyorsa, diğer bazı terminal komutlarında doğrudan kullanılamayan yollarla sonuçlanır. İdeal olarak, sonuçlarda eğik çizgiler eklenir. MacOS'ta bu benim için çalışıyor:

find / -iname "*SEARCH TERM spaces are okay*" -print 2>&1  | grep -v denied |grep -v permitted |sed -E 's/\ /\\ /g'

-1

find / -print bunu yapacak


1
... ne yazık ki başka bir şey yapacak (filtrelenmedikçe 'bazı' diğer dosyaları görüntülemek gibi)
DerMike

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.