Shell编程,循环遍历文件

时间:2010-12-02 22:45:54

标签: bash shell

我正在尝试遍历指定目录中的文件。但我似乎无法弄清楚逻辑。我循环遍历每个文件并询问他们是否要删除该文件。

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

5 个答案:

答案 0 :(得分:4)

你的代码似乎要复杂得多。这是否满足您的需求,或者您正在做一些shell练习?

rm -iv DIRECTORY/*

答案 1 :(得分:2)

不需要ls,你已经有了文件名。改变这个:

if test -f `ls -1 $1`

为:

if test -f "$f"

为什么在这里使用echo和反引号?变化

echo `rm $f`

为:

rm "$f"

这是你不必要地使用反引号的另一个地方。改变这个:

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

为:

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

始终引用包含文件名的变量。

答案 2 :(得分:2)

您可以让rm通过其-i标志为您“询问”,以便在删除之前提示用户。我假设您只想考虑文件,而不是目录,而不是递归任何子目录。

#!/bin/bash

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

答案 3 :(得分:0)

没有错误,无法真正提供帮助,但它可以像这样编写,而不是详细而不是

rm -i *

答案 4 :(得分:0)

如果$1是相对路径,那么当您cd进入$1后,for循环中的通配符将毫无意义。我建议更像

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

因为它会接受相对路径和绝对路径。

此外,第一个test的参数是错误的。每次循环时,$ f将保存一个文件名,因此您的测试应该像

 if (test -f $f); then

您还可以在echo参数中重复此操作。

以下基本上是您想要的,只需对您的脚本稍作修改即可。

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