Оболочка программирования, циклический просмотр файлов - PullRequest
1 голос
/ 03 декабря 2010

Я пытаюсь перебрать файлы в указанном каталоге.Но я не могу понять логику.Я перебираю каждый файл и спрашиваю, хотят ли они удалить этот файл.

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

4 голосов
/ 03 декабря 2010

Ваш код выглядит намного сложнее, чем должно быть. Удовлетворяет ли это вашим потребностям, или вы занимаетесь какой-то практикой оболочки?

rm -iv DIRECTORY/*
2 голосов
/ 03 декабря 2010

Вы можете rm сделать «запрос» за вас с помощью флага -i, чтобы запросить пользователя перед удалением. Я предполагаю, что вы хотите рассматривать только файлы, а не каталоги, и не создавать никаких подкаталогов.

#!/bin/bash

for f in $1/* ; do 
    if [ -f $f ] ; then 
        rm -i $f ; 
    fi
done
2 голосов
/ 03 декабря 2010

Нет необходимости в 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"

Всегда заключайте в кавычки переменные, которые содержат имена файлов.

0 голосов
/ 03 декабря 2010

Если $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
0 голосов
/ 03 декабря 2010

Без ошибки не может помочь, но это можно написать так, но не так подробно, хотя

rm -i *
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...