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?
Veuillez utiliser 'pour file in *' au lieu de '$ (ls)'. Par exemple, «touchez» un fichier »et surveillez l'erreur relative au« fichier » –
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)? –
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 –