“Ls” komutu çalışmadığında ne kullanılır?


15

lsKomutu kullanmaya çalıştım ve bir hata aldım:

bash: /bin/ls: cannot execute binary file

Bu komut yerine ne kullanabilirim?


Belki senin libc*soya da senin berbatld-linux*so
Basile Starynkevitch

31
Şahsen, biraz tuhaf bir düşünce deneyi olmadıkça, sistemimi düzeltmeye odaklanacağım.
Faheem Mitha

2
@BasileStarynkevitch bunu hiç duymadı, ancak Busybox yaygın olarak mevcut ve
içeri girebilir

8
... bir sistem kurtarma cd'si mi?
Federico Poloni

1
Bu gibi durumlarda asıl sorunu ele alan bir soru superuser.com/questions/435988'dir . Ve çok zımni olarak, nadir olmaktan, sashkullanılabilir Ubuntu Linux üzerinde olduğu gibi, kabukları / kanat olarak FreeBSD uyarlama ağacında, bir Gentoo paketiyle , hem de dahil olmak üzere başka yerlerde yazarı doğrudan .
JdeBP

Yanıtlar:


32

Bunun yerine echoveya findkomutlarını kullanabilirsiniz ls:

echo *

veya:

find -printf "%M\t%u\t%g\t%p\n"

7
Kullanacağımecho -- *
Edward Torvalds

9
@Invoker: -nGeçerli dizinde çağrılan bir dosyaya sahipseniz , bu yankılanacak bir şey değil, bir bayrak olarak yorumlanır.
MvG

2
O olurdutouch ./-n
Basile Starynkevitch

1
@Invoker Alfabetik sıra önemlidir. Bu fark yaratan bir vaka için oneliner çalıştırın:rm -rf /tmp/foo && mkdir /tmp/foo && cd /tmp/foo && touch ./-n oops && set -x && ls && echo *
jlliagre

3
echoonur gibi görünmüyor --, aslında . Öyleyse nasıl echo -- *daha iyi echo "" *ya da daha iyi echo "The file(s) are:" *?
G-Man,

24

printfEcho yerine komutu da kullanabilirsiniz :

printf '%s\n' *

printfdaha üstün echoolduğunu, bu durumda echoyok değil "çift çizgi" saygı ( --) bağımsız değişken listesinin sonunu belirtmek için (bunu test nedir Ubuntu 14.04 dahil bazı sistemleri üzerinde):

llama@llama:~$ mkdir -p Misc/unix210948
llama@llama:~$ cd !$
cd Misc/unix210948
llama@llama:~/Misc/unix210948$ touch -- -n
llama@llama:~/Misc/unix210948$ ls
-n
llama@llama:~/Misc/unix210948$ echo *
llama@llama:~/Misc/unix210948$ echo -- *
-- -n
llama@llama:~/Misc/unix210948$ printf '%s\n' *
-n

Bu durumda, istenen sonucu elde edemezsiniz echo(adlı -nbir seçenek bir seçenek olarak yorumlanır ve çift çizgi çalışmaz, bu nedenle kullanmanız gerekir printf).

Eğer gerektiği Not hep birlikte bilinmeyen veriler ile uğraşırken yukarıdaki gibi bir biçim dizesi kullanmak printfaksi beklenmeyen sonuçlar alabilir çünkü (yorumlarda bu işaret için @ G-Man sayesinde!):

llama@llama:~/Misc/unix210948$ rm ./-n
llama@llama:~/Misc/unix210948$ touch '\n'
llama@llama:~/Misc/unix210948$ ls
\n
llama@llama:~/Misc/unix210948$ printf -- *

llama@llama:~/Misc/unix210948$ printf '%s\n' *
\n

\nAdlı bir dosya tarafından yeni satır olarak yorumlanır printf. Bundan kaçınmak için, printf( %s) için bir biçimlendirme dizesi kullanırız ve dosya adlarını (daha önce olduğu gibi globbing yoluyla genişletilir) geçiririz.

Bu printf+ biçimlendirme dize çözeltisi (bu bir ile başlayan ve aynı zamanda davranır "gizli" dosyaları, dosya adları çeşitli işleyebilir ., aynı ls):

llama@llama:~/Misc/unix210948$ rm ./*
zsh: sure you want to delete all the files in /home/llama/Misc/unix210948/. [yn]? y
llama@llama:~/Misc/unix210948$ touch -- '-n' '\n' 'name with spaces' '.hidden'
llama@llama:~/Misc/unix210948$ ls
-n  \n  name with spaces
llama@llama:~/Misc/unix210948$ printf '%s\n' *
-n
\n
name with spaces

Senin Eğer printfdesteklerin %q, bunu da kullanabilirsiniz ( printf '%q\n' *). Dosya adlarınızda garip karakterler varsa boşluklardan, yeni satırlardan vb. Kaçacaktır. ( Bunu işaret ettiği için sohbet eden muru'ya teşekkürler !)


2
Bilinmeyen verilerle uğraşırken DAİMA kullanmalısınız '%s'( \nve / veya istediğiniz diğer sabit metinlerle). Örneğin, komutları deneyin touch '%.0s' foo bar; ls; printf -- *. Tersine, --bir '%s\n'biçim dizginiz olduğunda neden ihtiyacınız olduğunu anlamıyorum .
G-Man, 'Monica'yı Yeniden Başlat' diyor

@ G-Man İyi bir nokta! Teşekkürler, --biçim dizesi ile gereksiz gözden kaçan ve başka bir şey ele almak için yazı düzenledi.
Kapı Tokmağı

-nDosya adı dürüstçe olmamalıdır bir POSIX-2001 + için hiç bir sorun echoSUSv3 sistemlerde - echoaracıdır gerekli herhangi bir seçenek kabul etmemek. bash's echove bazı diğerleri bu seçeneği ele alır, ancak bashher zaman --enable-xpg-echo-defaultdoğru davranmasını sağlamak için build seçeneği ile derlenebilir . Bununla birlikte, doğru davranış , argümanlarındaki boşlukların her zaman yorumlanması echoanlamına gelir . C tarzı kaçış ile herhangi bir dosya adı yüzden olmaz çıkışına yazılabilir w / sadakat - çevirmek olacaktır. echo
mikeserv

2
lütfen, lütfen, unix faq 10 yıldan beri "./" kullanmanın daha iyi ve daha taşınabilir olduğunu açıkladığında herkes "-" önerilerini durdurmalıdır. ')
Olivier Dulac

1
@OliverDulac - bu bile bir uygunluk uyandırmaz echo.
mikeserv

8

Muhtemelen fileve unameyardımcı programlarını, makinenizde neler olup bittiği hakkında daha iyi bir fikir edinmek için kullanmalısınız . Hatanız, çağrıldığı sistem mimarisi ile uyumlu olmayan bir sistem mimarisi için derlenmiş bir ikili yürütülebilir dosyayı gösterir.

Makinemde:

uname -m; file /bin/ls

... baskılar ...

x86_64
/bin/ls: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=..., stripped

... çünkü her şey oradaki dünya için doğru. Ancak, sshmasaüstümle bir bağlantıda android tabletimden çalıştırılan bazı komutların biraz çalışması ...

#first copy android ls to desktop
scp /system/bin/ls "$ssh:arm_ls"

ls               100%  151KB 151.4KB/s   00:00

#next login to desktop and run the following
ssh "$ssh" '
   HOME=./arm_ls
   chmod +x ~
   file ~
   bash -c ~ ||
   rm ~
'

./arm_ls: ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /system/bin/linker, stripped
bash: ./arm_ls: cannot execute binary file: Exec format error

Bu, bir senaryoyu kapsayan ve altta yatan olası nedeni ele alan harika bir cevaptır.
Pranab

yanlış ^ ^ üzgünüm. neden sadece dosyayı kopyalayıp kullanmıyorsunuz? neden bütün homedir şey? masaüstüne scp, dosya ve bash ./it?
Olivier Dulac

@OlivierDulac -hmm .. Tam olarak sorduğun şeyden bahsettiğimden emin değilim. Bu HOME=yüzden kolaylık sağlamak için sadece ~yerine birkaç kez yapabilirim ./arm_ls. Alıştırmanın tüm noktası, x86 masaüstümde kol ikili kullanamayacağım ve çıktısının file, sydtem'in doğal olanından çok farklı bir ikili olduğunu göstermesini istedim - üstte gösteriliyor. Ve böylece bütün bir çapraz derleme shpw yerine, benim kol devimde x86 cihazım için kullanılabilir vardı uyumsuz bir ikili cpy seçti ve sonuçları göstermek ve bashhatayı nasıl ger .
mikeserv

1
oh, sadece birkaç yazım kaydetmek mi? tamam, ama bence olması gerekenden daha kafa karıştırıcı (codegolf değil ^^)
Olivier Dulac

1
@OliverDulac - elbette kod altın değil, ama uygun, hiç belirsiz değil ve başparmak yazmadan nefret ediyorum.
mikeserv

5

Bash (veya diğer birçok mermi) kullanarak dosyaları listelemek için sekme tamamlamayı kullanabilirsiniz:

$ thisisnotacommand ./public_html/<TAB>
acc/              papers/           android/          l/
sdr/              blast             formalcss.html    switch/
busy/             formalcss.tar.gz  others/           together.jpg

3

Daha fazla bir şey istiyorsanız ls -l(dosya boyutu, izinler, sahip, zaman damgaları, vb.), O stat -- *zaman yardımcı olabilir:

$ ls -l
total 8
-rw-rw-r-- 1 ubuntu ubuntu   4 Jun 20 21:50 a.txt
-rw-rw-r-- 1 ubuntu ubuntu 279 Jun 20 21:50 b.txt
$ stat -- *
  File: ‘a.txt’
  Size: 4           Blocks: 8          IO Block: 4096   regular file
Device: 801h/2049d  Inode: 787691      Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1000/  ubuntu)   Gid: ( 1000/  ubuntu)
Access: 2015-06-20 21:50:23.395223851 -0700
Modify: 2015-06-20 21:50:23.395223851 -0700
Change: 2015-06-20 21:50:23.395223851 -0700
 Birth: -
  File: ‘b.txt’
  Size: 279         Blocks: 8          IO Block: 4096   regular file
Device: 801h/2049d  Inode: 844130      Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1000/  ubuntu)   Gid: ( 1000/  ubuntu)
Access: 2015-06-20 21:50:31.763084155 -0700
Modify: 2015-06-20 21:50:51.066758216 -0700
Change: 2015-06-20 21:50:51.066758216 -0700
 Birth: -
$ 

Alternatif olarak, yapmak istediğiniz tek şey yanlış yazılmışsa ls, bunun yerine deneyinsl . ;-) (devam et - dene ... kurman gerekebilir)


3

Birçok sistemde çok benzer bir yardımcı program vardır:

dir

Bilgi sayfalarına göre eşdeğerdir ls -C -b, ancak bağımsız ikili dosyadır.

Kullanmanın yararı dir(örneğin kabuk tamamlama sistemi yerine), standart lsprogramda olduğu gibi, sıralama, gizli dosyaları gösterme, renklendirme vb. Gibi farklı seçeneklerin kullanılabilirliğidir .

BTW, sanırım adı windows (veya daha doğrusu dos) sisteminden geliyor.


1

kullanım

 echo -- *
    find . -printf "%M\t%u\t%g\t%p\n"
    ls -C -b
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.