2017-08-07 1 views
0

Problème: Les dossiers sont traités comme des fichiersEcrire un script Bash qui prendra un seul argument de ligne de commande (un répertoire) et affichera chaque entrée dans ce répertoire

Mon code:

#!/bin/bash 

for var in $(ls) 
do 
    echo $var 
    if [ -e $var ] 
    then 
     echo "This is a file" 
    else 
     echo "This is not a file" 
    fi 
done 

echo All Done 

Current Contents du dossier racine:

-rw-r--r-- 1 stibo stibo 401 Sep 17 2015 id_rsa.pub drwxrwxr-x 24 stibo stibo 4096 Jul 26 09:25 step -rwxr-xr-x 1 stibo stibo 51 Jul 27 12:51 test.txt drwxrwxrwx 2 stibo stibo 4096 Aug 2 10:32 deletionFile -rwxrw-r-- 1 stibo stibo 225 Aug 2 12:32 deletionScript.vi -rw-rw-r-- 1 stibo stibo 235 Aug 2 12:33 logdetails.txt -rw-rw-r-- 1 stibo stibo 123 Aug 2 12:42 path1.txt -rw-rw-r-- 1 stibo stibo 285 Aug 2 16:18 path2.txt drwxrwxr-x 2 stibo stibo 4096 Aug 3 10:14 archival -rw-rw-r-- 1 stibo stibo 0 Aug 3 13:42 ls -rw-rw-r-- 1 stibo stibo 164732 Aug 3 14:11 messages -rw-rw-r-- 1 stibo stibo 164732 Aug 3 14:11 wtmp drwxrwxrwx 2 stibo stibo 4096 Aug 3 14:21 backup -rwxrwxr-x 1 stibo stibo 160 Aug 4 15:34 newScript.vi -rw-rw-r-- 1 stibo stibo 160 Aug 4 15:41 Code.txt -rw-rw-r-- 1 stibo stibo 0 Aug 4 15:43 Details.txt

Où il y a 4 dossiers et 12 fichiers. Mais quand j'exécute le script, je peux voir que tout est considéré comme un fichier, même s'il y a des dossiers dedans.

Pouvez-vous s'il vous plaît laissez-moi savoir où je vais mal?

Répondre

0

Vous avez testé si une entrée existe avec -e. Utilisez -d pour tester les répertoires et -f pour les fichiers

+0

Veuillez utiliser 'pour file in *' au lieu de '$ (ls)'. Par exemple, «touchez» un fichier »et surveillez l'erreur relative au« fichier » –

+0

Oui, cela fonctionne si je garde l'option -f pour le fichier. Aussi j'ai utilisé pour le fichier dans *. Pourquoi est-ce suggéré au lieu de $ (ls)? –

+0

Vous lisez chaque mot dans la sortie de ls dans votre boucle. Si le répertoire/fichier contient des espaces, vous n'obtiendrez pas l'entrée spearated espace mais deux entrées distinctes. Si vous devez utiliser $ (ls), utilisez "$ (ls)" car (dans une certaine mesure) traitera des espaces dans les entrées –