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.
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:
find ./ -printf "%f\n"
ou
for n in *; do printf '%s\n' "$n"; done
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}'
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.
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.
Je me demande pourquoi personne n'a mentionné cette simple commande:
ls -a | sort
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
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:
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
Que diriez-vous:
for file in * .[!.]*
do
printf "%s\n" "$file"
done
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.