Перемещение пустых файлов из текущего каталога в подкаталог - PullRequest
1 голос
/ 20 февраля 2020

Я пытаюсь создать сценарий bash, который проверит, существует ли подкаталог "Empty_Files" в текущем каталоге, и если он не будет создан, он создаст подкаталог. Затем он проверит все обычные не скрытые файлы в текущем каталоге и, если файл пуст, спросит, хотите ли вы переместить файл. Если пользователь скажет «да», он переместит файл в каталог Empty_Files. Однако, когда я запускаю скрипт, он просто говорит, что в текущем каталоге не найдено ни одного пустого файла, но все равно спрашивает, хочу ли я переместить файл. Не уверен, почему он это делает. Любая помощь будет одобрена.

   #!/bin/bash

#Script to move empty files from current directory into the sub directory Empty_Files

# usage:  ./move_empty


subdirectory="Empty_Files"


if [ -f $subdirectory ]  # does the Empty_Files file exist?
then
   echo $subdirectory "exists!"
else
   mkdir -p /home/student/Empty_Files
   echo "Empty_Files subdirectory created"
fi

currentfiles=$( ls . )  # check all non hidden files in current directory

for eachfile in $currentfiles
do
   checksize=$(du -sh $eachfile | awk '{print $1}')

   if [ "$checksize" = "0" ] # check if any files are empty
   then
      echo -n "Would you like to move the file Y/N:" # if a file is empty ask the user if the want to move the file
      read useranswer
   fi

   if [ "$useranswer" = "y" ] || [ "$useranswer" = "Y" ]
   then
      mv "$eachfile" /home/student/Empty_Files
      echo "mv command successful"
   elif [ "$useranswer" = "n" ] || [ "$useranswer" = "N" ]
   then
      echo "File will not be moved"
   fi

   if [ ! -z "$currentfiles" ]
   then
      echo "no empty files found in the current directory"
      #exit 55
   fi
done

1 Ответ

0 голосов
/ 20 февраля 2020

У вас есть несколько проблем.

Когда файл не пустой, вы пропускаете код, который спрашивает пользователя, хотят ли они переместить файл, но вы все равно выполняете код, который перемещает файл. Он использует значение $useranswer из предыдущего файла, поэтому он перемещает все непустые файлы после перемещения пустого файла, пока не перейдет к следующему пустому файлу. Код, который выполняет перемещение, должен находиться внутри if, который проверяет длину.

Проверка на то, печатать ли «Пустые файлы не найдены», просто неверна. $currentfiles - это список всех файлов, а не пустых файлов. И ваш тест задом наперед: вы проверяете, не является ли переменная пустой. Что вы должны сделать, это установить переменную, когда вы найдете пустой файл. Затем, после выполнения l oop, вы можете проверить эту переменную.

Существует встроенный тест для определения того, имеет ли файл ненулевой размер, вам не нужно использовать du для этого.

Вы не должны анализировать выходные данные ls, используйте подстановочный знак.

Если вы собираетесь напечатать сообщение о том, что перемещение было успешным, вы должны на самом деле проверить, что оно было .

Вопрос, спрашивающий, хотят ли они переместить файл, не говорит, какой это файл.

emptyfound=n
for eachfile in *
do
    if [ ! -s "$eachfile" ] # check if any files are empty
    then
        emptyfound=y
        echo -n "Would you like to move the file $eachfile Y/N:" # if a file is empty ask the user if the want to move the file
        read useranswer

        if [ "$useranswer" = "y" ] || [ "$useranswer" = "Y" ]
        then
            if mv "$eachfile" /home/student/Empty_Files
            then echo "mv command successful"
            else echo "mv command failed"
            fi
        else
            echo "File will not be moved"
        fi
    fi
done

if [ "$emptyfound" = n ]
then
    echo "no empty files found in the current directory"
    #exit 55
fi
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...