2010-12-02 26 views
1

J'essaye de faire défiler les fichiers dans un répertoire spécifié. Mais je n'arrive pas à comprendre la logique. Quelqu'un peut-il aider? Je suis en boucle à travers chaque fichier et demande s'ils veulent supprimer ce fichier.Programmation Shell, ébranchage des fichiers thorugh

#!/bin/bash 
dirpath=$1 
y=y 
Y=Y 
echo "changing directory '$dirpath' `cd $dirpath`" 

for f in $1/* 
do 
##################################### 
if test -f `ls -1 $1` 
then 
echo -n "remove file '$f' `ls -1` ?" 
read answer 
########################## 
if test $answer = $y || test $answer = $Y 
then 

    echo "Processing $f file..." 
    echo `rm $f` 
    echo "file '$f' deleted " 
else 
echo "file '$f' not removed" 

    fi#2nd if loop 
############################ 
else 
echo 'not a file' 
    fi#1st if loop 
####################################### 

done 
+0

Quel est le problème? –

Répondre

2

Il n'y a pas besoin de ls, vous avez déjà le nom du fichier. Changer ceci:

if test -f `ls -1 $1` 

à:

if test -f "$f" 

Pourquoi utilisez-vous echo et des backticks ici? Changer

echo `rm $f` 

à:

rm "$f" 

Voici un autre endroit que vous utilisez inutilement des accents graves. Changer ceci:

echo "changing directory '$dirpath' `cd $dirpath`" 

à:

echo "changing directory '$dirpath'" 
cd "$dirpath" 

Indiquez toujours les variables qui contiennent des noms de fichiers.

4

Votre code semble beaucoup plus compliqué qu'il devrait l'être. Est-ce que cela répond à vos besoins ou pratiquez-vous la coquille?

rm -iv DIRECTORY/* 
+0

Cela ne demande pas à l'utilisateur si vous souhaitez ou non supprimer le fichier – Steven

+1

@shambleh, l'option -i (interactive) vous invite à confirmer. –

+0

+1 c'est une bonne habitude de spécifier le répertoire pour rm, même si c'est le répertoire actuel 'rm ./*' –

0

Sans l'erreur, ne peut pas vraiment aider, mais il pourrait être écrit comme ça, pas aussi bavard que

rm -i * 
2

Vous pouvez demander à rm de "vous demander" via son indicateur -i pour demander à l'utilisateur de le supprimer avant de le supprimer. Je suppose que vous voulez considérer seulement des dossiers, pas des répertoires, et ne pas recurse aucun sous-répertoire.

#!/bin/bash 

for f in $1/* ; do 
    if [ -f $f ] ; then 
     rm -i $f ; 
    fi 
done 
0

Si $1 est un chemin relatif, alors une fois que vous avez cd « d en $1, le caractère générique dans votre boucle for sera dénuée de sens. Je recommanderais quelque chose de plus comme

cd $1 
for f in *; do 
    ... 
done 

Comme il acceptera les chemins relatifs et absolus.

De plus, les arguments du premier test sont erronés. Chaque fois à travers la boucle, $ f détiendra un nom de fichier, de sorte que votre test doit être comme

if (test -f $f); then 

Vous répétez également dans vos echo arguments.

Ce qui suit fait fondamentalement ce que vous voulez, avec seulement de légères modifications de votre script.

#!/bin/bash 
dirpath=$1 
y=y 
Y=Y 
echo "changing directory '$dirpath' `cd $dirpath`" 

for f in ./*; do 

if (test -f $f); then 
     echo -n "remove file '$f' ?" 
     read answer 
     if (test $answer == $y) || (test $answer == $Y); then 

       echo "Processing $f file..." 
       rm $f 
       echo "file '$f' deleted " 
     else 
       echo "file '$f' not removed" 
     fi 
else 
     echo 'not a file' 
fi 

done