2009-11-30 4 views
3

EDIT: Voici mon code mis à jour:Bash Script "[: not found" erreurs, et comment écrire une ou déclaration

#!/bin/sh 
files=`ls` 
if [ $# -ne 1 -o -f $1 ] 
then 
     echo "Usage: $0 <directory>" 
     exit 1 
fi 
if [ ! -e $1 ] 
then 
     echo "$1 not found" 
     exit 1 

elif [ -d $1 ] 
then 
cd $1 

for f in $files 
do 
     if [ ! -d "$f" ] 
     then 
      if [ ! -s "$f" ] 
      then 
       rm -r "$f" 
     echo "File: $f was removed." 
     else 
     continue 
     fi 
fi 
done 


echo "Name\t\tLinks\t\tOwner\t\tDate" 

for f in $files 
     do 
       find "$f" -type f -printf "%f\t\t %n\t\t %u\t %TH %Tb %TY\n" 
     done 
     exit 0 
fi 

je fixe tous les problèmes d'espacement, a changé # bin/sh à #/bin/bash, et ajouté des guillemets à "$ f". Cependant, je reçois encore beaucoup d'erreurs.

ava @ Kosh: ~/test $ ./delDir d1 rm: ne peut pas supprimer d1': No such file or directory File: d1 was removed. rm: cannot remove delDir ': Aucun fichier ou fichier répertoire: delDir a été supprimé. rm: impossible de supprimer delDir2': No such file or directory File: delDir2 was removed. rm: cannot remove e1 ': Non tel fichier ou répertoire Fichier: e1 a été supprimé . rm: impossible de supprimer e2': No such file or directory File: e2 was removed. rm: cannot remove make_d1 ': Aucun fichier ou répertoire de ce type Fichier: make_d1 a été supprimé. Nom \ t \ tLinks \ t \ Towner \ t \ TDate trouver: d1: Aucun fichier ou répertoire Recherche: delDir: Aucun fichier ou répertoire trouver: delDir2: Aucun fichier ou répertoire Recherche: e1: Non fichier ou répertoire Recherche: e2: Aucun fichier ou répertoire Recherche: make_d1: Aucun fichier ou répertoire ne1 2
ava 22 novembre 2009 NE2
2 ava 22 novembre 2009

Est-ce que quelqu'un sait Qu'est-ce que je fais d'autre?

Voici mon code:

#!/bin/sh 
files=`ls` 
if [ $# -ne 1 ] 
then 
     echo "Usage: $0 <directory>" 
     exit 1 
fi 
if [ ! -e $1 ] 
then 
     echo "$1 not found" 
     exit 1 

elif [ -d $1 ] 
then 
cd $1 

for f in $files 
do 
     if [! -d $f] 
     then 
      if [ ! -s $f ] 
      then 
       rm-r $f 
     echo "File: $f was removed." 
     else 
     continue 
     fi 
fi 
done 


echo "Name\t\tLinks\t\tOwner\t\tDate" 

for f in $files 
     do 
       find $f -type f -printf "%f\t\t %n\t\t %u\t %TH %Tb %TY\n" 
     done 
     exit 0 
fi 

Voici mes questions:

  1. Si j'exécute le script avec quelque chose qui est pas un fichier ordinaire et n'est pas un répertoire I voulez-le dire "Utilisation: répertoire de noms de fichiers" (voir ligne 5). Je sais que je peux le faire avec 2 si les déclarations, mais est-il possible de créer une déclaration ou pour cela dans bash?

  2. Quand je lance le script que je continue à recevoir des erreurs comme ceci:

./delDir: 39: [: not found ./delDir: 39: [: not found ./ delDir: 39: [!: non trouvé ./delDir: 39: [!: pas trouvé ./delDir: 39: [!: non trouvé ./delDir: 39: [!: non trouvé ./delRép: 39: [!: Non trouvé ./delDir: 39: [!: pas trouvé ./delDir: 39: [!: Pas trouvé ./delDir: [:!: Not found Nom
Liens propriétaire Date find: d1: Aucun fichier ou répertoire trouver: delDir: Aucun fichier ou trouver répertoire: delDir2: Aucun fichier ou répertoire e1 1
ava 22 novembre 2009 e2
1 ava 22 novembre 2009 Recherche: make_d1: Aucun fichier ou répertoire ne1 2
ava 22 novembre 2009 NE2
2 ava 22 novembre 2009

Je crois que je am obtenir ces erreurs parce que la boucle for est d'abord pour le fichier que l'utilisateur a tapé (le répertoire dans lequel il a été changé) et ne peut pas le trouver. Comment peut-on résoudre ce problème? 3. Y a-t-il d'autres erreurs que vous pouvez voir?

Répondre

4

Un autre problème est que, au début du script vous

files = `ls` 

mais vous cd dans un répertoire différent et essayez de boucle autour de fichiers $ les supprimer - Bien sûr, cela ne fonctionnera pas puisque vous avez changé de répertoire.

déplacez la ligne ls jusqu'à ce que vous ayez changé de répertoire.

+0

Ah ... ok je vois. J'essaie ça maintenant. –

+0

Ah ça l'a corrigé, merci Dave. –

10

Vous avez oublié de mettre un espace après [ et avant ] sur la ligne en disant:

if [! -d $f] 

et des tests sont créés à l'aide -a, -o est égal ou:

if [ ! -d $f -a -f $f ] 
if [ ! -d $f -o -f $f ] 
+0

Wow ... Je me sens bête merci pour ça. haha. –

+0

Voici ce qui se passe après que les espaces ont été supprimés: ava @ kosh: ~/test $ ./delDir d1 ./delDir: 39: rm-r: non trouvé Fichier: d1 a été supprimé. ./delDir: 39: rm-r: non trouvé Fichier: delDir a été supprimé. ./delDir: 39: rm-r: non trouvé Le fichier: delDir2 a été supprimé. ./delDir: 39: rm-r: non trouvé Fichier: e1 a été supprimé. ./delDir: 39: rm-r: non trouvé Le fichier: e2 a été supprimé. ./delDir: 39: rm-r: non trouvé Le fichier: make_d1 a été supprimé. Nom Liens propriétaire Date find: d1: Aucun fichier ou répertoire trouver: delDir: Aucun fichier ou répertoire trouver: delDir2: Aucun fichier ou répertoire e1 1 –

+1

Vous devez ajouter un espace entre le 'rm' et le '-r'; bash voit cela comme une commande 'rm-r' et non' rm -r'. –

2

Les autres réponses sont correctes, voici pourquoi: [est une commande. Si vous tapez "[!", Le shell recherche une commande de ce nom.

2

J'augmente d'autres réponses ici ... chaque fois que je vois une question bash commencer par #! /bin/sh Je dois sauter dedans, c'est un impératif moral. Gardez à l'esprit que /bin/sh indique l'appel POSIX de bash, ou un shell "posixically correct" complètement différent comme un tiret./bin/sh est souvent un lien symbolique qui fait que bash modifie son comportement pour être plus conforme POSIX. Par conséquent, beaucoup de goodies ne fonctionneront pas comme d'habitude, ou vous pouvez trouver votre code analysé par un autre shell.

En d'autres termes,/bin/sh == POSIX_ME_HARDER, mais .. yikes! == est un bashism :)

Si vous voulez bash, utilisez #!/bin/bash

Au-delà, la réponse de singingwolfboy devrait résoudre votre problème immédiat :)

+0

Oh je vois. Merci pour le conseil, je vais devoir l'utiliser. –

1

Les autres ont la question d'espacement avec le [, mais je remarqué un couple d'autres choses.

Vous avez probablement besoin d'un espace dans votre commande rm en ligne 23:

rm -r $f 

De plus, il est généralement une bonne pratique de chemins à double fichier de devis. Cela permettra à votre script de gérer correctement les noms de fichiers avec des espaces et d'autres caractères spéciaux.

rm -r "$f" 
+0

Merci pour l'info Amrox, j'ai ajouté les citations selon votre suggestion. Je vais devoir les utiliser à l'avenir. –

Questions connexes