web-dev-qa-db-fra.com

Comment afficher uniquement les noms de fichiers (avec des espaces) dans ls -Al?

Je ne devrais répéter que les noms de fichiers ou de répertoires avec cette construction:

ls -Al | while read string
do
...
done

ls -Al production :

drwxr-xr-x  12 s162103  studs         12 march 28 12:49 personal domain
drwxr-xr-x   2 s162103  studs          3 march 28 22:32 public_html
drwxr-xr-x   7 s162103  studs          8 march 28 13:59 WebApplication1

Par exemple, si j'essaye:

ls -Al | while read string
do
echo "$string" | awk '{print $9}
done

puis affichez uniquement les fichiers et répertoires sans espaces. Si le fichier ou le répertoire contient des espaces tels que "domaine personnel", ce ne sera que Word "personnel".

J'ai besoin d'une solution très simple. Peut-être qu'il y a une meilleure solution que awk.

93
Alex Zern

Vous ne devriez vraiment pas analyser la sortie de ls . S'il s'agit d'un devoir et que vous êtes obligé de le faire, votre professeur ne sait pas de quoi il parle. Pourquoi ne faites-vous pas quelque chose comme ça:

Le bon...

find ./  -printf "%f\n"

ou

for n in *; do printf '%s\n' "$n"; done

...le mauvais...

Si vous voulez vraiment utiliser ls, vous pouvez le rendre un peu plus robuste en faisant quelque chose comme ceci:

ls -lA | awk -F':[0-9]* ' '/:/{print $2}'

... et le laid

Si vous insistez pour le faire de manière incorrecte et dangereuse et que vous n'avez qu'à utiliser une boucle while, faites ceci:

ls -Al | while IFS= read -r string; do echo "$string" | 
    awk -F':[0-9]* ' '/:/{print $2}'; done

Sérieusement, ne le faites pas.

110
terdon

Y a-t-il une raison pour laquelle ls -A1 * ne fonctionnera pas?

Par exemple.:

$ touch file1 file2 file\ with\ spaces
$ ls -Al
total 0
-rw-r--r-- 1 bahamat bahamat 0 Mar 30 22:31 file1
-rw-r--r-- 1 bahamat bahamat 0 Mar 30 22:31 file2
-rw-r--r-- 1 bahamat bahamat 0 Mar 30 22:31 file with spaces
$ ls -A1
file1
file2
file with spaces
$

* Remarque: c'est une majuscule A et le numéro un.

87
bahamat

Je me demande pourquoi personne n'a mentionné cette simple commande:

ls -a | sort
50
Ben

Vous ne pouvez pas analyser la sortie de ls, encore moins ls -l parce que la nouvelle ligne, tout comme l'espace est un caractère aussi valide que n'importe quel autre dans un nom de fichier. De plus, vous devrez considérer les liens symboliques qui ont une sortie comme ... foo -> bar.

Pourquoi utiliseriez-vous -l de toute façon si vous ne voulez que le nom du fichier?

Faites juste:

for file in *; do
  ...
done

Si vous souhaitez inclure des fichiers de points (sauf . et ..), selon le shell:

zsh:

for file in *(ND); do
  ...
done

bash:

shopt -s nullglob dotglob
for file in *; do
  ...
done

ksh93:

FIGNORE='@(.|..)'
for file in ~(N)*; do
  ...
done

POSIX:

for file in .[!.]* ..?* *; do
  [ -e "$file" ] || [ -L "$file" ] || continue
  ...
done
5
Stéphane Chazelas

Essayez (bash, zsh, ksh93 syntaxe):

find . -type f -print0 | while IFS= read -r -d '' filename; do
  ...
done

Cela devient récursif et répertorie uniquement les fichiers normaux (c'est-à-dire pas de répertoires ou de liens symboliques/fifos/périphériques ...).

Voir également:

2
kenorb
ls -Al | tr -s ' ' | cut -f9- -d' '

compresser plusieurs espaces en espaces simples avec tr, vous pouvez alors utiliser cut to split sur les champs

2
simpleuser

Que diriez-vous:

for file in * .[!.]*
do
  printf "%s\n" "$file"
done
1
Scrutinizer

essayez ls -1enter image description here C'est entier 1

Depuis la page de manuel.

     ls -1     list one file per line.  Avoid '\n' with -q or -b
0
abdul rashid

La façon la plus simple d'imprimer tous les noms de fichiers dans le répertoire est probablement:

echo *

Inconvénient - n'imprime pas les fichiers cachés.

0
Grzegorz