我正在尝试遍历指定目录中的文件。但我似乎无法弄清楚逻辑。我循环遍历每个文件并询问他们是否要删除该文件。
#!/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 :(得分: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