2010-12-02 5 views
1

指定されたディレクトリのファイルをループしています。しかし、私はその論理を理解していないようです。助けてもらえますか?私は各ファイルをループして、そのファイルを削除するかどうか尋ねています。シェルプログラミング、スレッドファイルのロッキング

#!/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

問題が何ですか? –

答えて

2

のに本当に役立つことはできませんが、それはこのように書くことができ、ない、あなたはすでにファイル名を持っています。

if test -f `ls -1 $1` 

:これを変更

if test -f "$f" 

なぜあなたはここにechoとバッククォートを使用していますか?ここでは、不必要にバッククォートを使用している別の場所だ

rm "$f" 

echo `rm $f` 

に変更します。必ずファイル名を含む変数を引用

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

:に

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

:これを変更します。

4

コードははるかに複雑であるようです。これはあなたのニーズを満たすか、シェルの練習をしていますか?エラーがなければ

rm -iv DIRECTORY/* 
+0

ファイルを削除するかどうかを問い合わせるクエリを実行しないでください。 – Steven

+1

@shambleh -i(対話型)オプションは、確認を求めるプロンプトを表示します。 –

+0

+1現在のディレクトリ 'rm ./* 'であっても、rmのディレクトリを指定するのは良い習慣です。 –

0

、として冗長lsの必要はありません

rm -i * 
2

rmに「-i」というフラグを付けて削除する前に「尋ねる」ことができます。私はあなたがファイルだけを考慮し、ディレクトリではなく、サブディレクトリを再帰しないと思っています。

#!/bin/bash 

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

$1が相対パスであれば、あなたは「$1cd日間したら、あなたのforループ内のワイルドカードは無意味になります。より多くのものをお勧めします

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

これは相対パスと絶対パスの両方を受け入れるためです。

また、最初のtestの引数が間違っています。ループを通るたびに、$ fは1ファイル名を保持しますので、あなたはまた、あなたのecho引数でこれを繰り返し

if (test -f $f); then 

のようなあなたのテストはする必要があります。

以下は基本的にスクリプトからわずかな変更を加えただけのものです。

#!/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 
関連する問題