Unix dosya adı olsun "ls-la"

11 Cevap php

Nasıl bu satırlardan herhangi birinden dosya adını döndürür düzenli ifadeler desen üretebilir? (Ben bir defada bir satır arayacaktır).

drwxrwxrwx  4 apache      apache       4096 Oct 14 09:40 .
drwxrwxrwx 11 apache      apache       4096 Oct 13 11:33 ..
-rwxrwxrwx  1 apache      apache      16507 Oct 17 10:16 .bash_history
-rwxrwxrwx  1 apache      apache         33 Sep  1 09:36 .bash_logout
-rwxrwxrwx  1 apache      apache        176 Sep  1 09:36 .bash_profile
-rwxrwxrwx  1 apache      apache        124 Sep  1 09:36 .bashrc
-rwxrwxrwx  1 apache      apache        515 Sep  1 09:36 .emacs
-rw-------  1 christoffer christoffer 11993 Sep 18 10:00 .mysql_history
drwxrwxrwx  3 apache      apache       4096 Sep  1 09:48 .subversion
-rwxrwxrwx  1 christoffer christoffer  9204 Oct 14 09:40 .viminfo
drwxrwxrwx 14 apache      apache       4096 Oct 12 07:39 www

Arama PHP kullanılarak yapılabilir, ama bu gerçekten bir fark yapmaz sanırım edilir. :)

EDIT: dosya listeleme, bir SSH bağlantısı ile alınan ve bir PHP fonksiyonu yerleşik kullanmayın neden olur. Ben bir dosya aslında bir dizin olup olmadığını görmek için bu tam liste gerekir.

11 Cevap

Try ls -a1F yerine. Bu size tüm girdileri (-a) listeler, her satıra bir (-1), adına eklenen dosya türü hakkında ek bilgi ile (-F).

Daha sonra muhtemelen dizin için bu gibi bir şey elde edeceksiniz:

./
../
.bash_history
.bash_logout
.bash_profile
.bashrc
.emacs
.mysql_history
.subversion/
.viminfo
www/

Dizinleri sonunda bir çizgi / var.

Bunun yerine ls çıkış, sadece kullanmak ayrıştırma daha dizinleri, arıyorsanız find.

find -maxdepth 1 -mindepth 1 -type d

Bu, böyle dizinleri listelemek olacaktır:

./Documents
./.gnupg
./Download

Sen artık bir dizin ne olduğunu belirlemek için veri ayrıştırmak zorunda ve ne değildir.

Aslında dosyaları değil dizinleri isteyen ediyorsanız, bunun yerine -type f kullanın.

ls çıktı Sizin ayrıştırma çok iyi sembolik üzerinde kırılabilir ...

Ben regex kullanmak olmaz

Bir çizgi göz önüne alındığında, patlayabilir ve diziden son öğeyi pop

if (preg_match('/^d/', $line)) {
    $name = array_pop(explode(' ', $line));
}

EDIT: örneklerin hiçbiri alanlarda gömülü ama daha sonra açıklama bulmak için önemli olduğunu göstermektedir filenames

Dedi Matthew ne ekleme, not ls ayrıştırmak çıkış nedenleri bol var. Dosya adlarında boşluk olabilir - hatta karakterleri silin. Özellikle eski dosyalar için liste, tarih kısmının biçimi büyük dosyaların boyutu liste kırabilir, farklı.

Eğer regex kullanmanız gerekir, ve gerçekten dosya adlarında boşluk varsa, o zaman sadece satırın sonuna kadar kravat ve olmayan alanlarda orada bulabilirsiniz olsun

(\S+)$

SPL ve DirectoryIterator kullanarak PHP5'ta bunu yapmak için güzel bir yolu var

$dir = '.';
foreach (new DirectoryIterator($dir) as $fileInfo) {
    echo $fileInfo->getFilename() . "<br>\n";
}

Tam dizin listesini kullanarak sizin kısıt göz önüne alındığında ben bu şekilde yapardı:

ls -l | egrep '^d' | awk '{print $NF}'

Egrep komut satırın başında "D" harfi için arama olacaktır. Varsayılan olarak awk ayraç olarak boşluk kullanır ve $ NF size son öğe alacak. Dosya adı içinde boşluklar olurdu ben bu her zaman% 100 işe yaramaz nerede aklınıza sadece kenar durumdur.

Ben find komutunu kullanmanızı öneririm:

find . -maxdepth 1 -type d | awk -F '/' '{print $NF}'

Yukarıdaki find komutu size geçerli dizinde sadece dosyaları / dizinleri (b / c-MaxDepth 1 arg) alacak. Awk komutu '/' kullanarak hattı bölünmüş olacak ve sadece son belirteci ($ NF) alır.

Awk komutu, çünkü

awk -F '/' '{print $NF}'

size aslında kullanabileceğiniz son öğe alacak:

find . -maxdepth x -type d

x Seçtiğiniz> = 1 bir sayı olduğu, yine istediğini elde, dosya ve / veya dizin adı. olacak

\S+\s+\S+\s+\S+\s+\S+\s+\S+\s+\S+\s+\S+\s+\S+\s+(\S+)

Her dize boşlukla ayrılmış 9 parça inşa edilmiştir. Sen 9. bölümde arıyoruz.

glob('*') yerine kullan?

Bunun yerine nasıl ilk etapta biraz daha yararlı çıktı üretme konusunda zor çıktı, ayrıştırmak çalışıyorum. Örneğin:

ssh user@machine 'cd /etc; for a in *; do [ -f "$a" ] && echo "$a"; done'

uzak makinede / etc içinde dizin olmayan dosyaların bir listesini oluşturacaktır. Bu ayrıştırmak için çok daha kolay olmalıdır.

Görüntüler bana inanmıyorsanız deneyin, çok dosyalar gizli.

 glob('{,.}*', GLOB_BRACE);