Я пытаюсь написать сценарий оболочки, который находит определенный файл и перемещает его в папку.

    #!/bin/sh
echo -n "/home/cosmoretro/movie/"
        read text2
while :
        do
        echo -n "Ara:"
        read text1
        b=$(find /home/cosmoretro 2>/dev/null -iname "$text1"*)
        IFS=$'\n'
    mv $b /home/cosmoretro/movie/"$text2"
done

Но он также перемещает файлы, если файл совпадает с папкой, которую я ищу. Все, что я хочу, это только перемещение папки.

Заранее спасибо.

1 ответ1

1

Мне трудно даже читать этот сценарий. Могу ли я предложить вам переписать это немного?

#!/bin/sh
echo -n "/home/cosmoretro/movie/"
read destinationFileName

while :
do
    echo -n "Ara:"
    read sourceFileName
    sourceFile=$(find /home/cosmoretro -type d -iname "$sourceFileName" -print -quit 2> /dev/null)
    if [[ -z $sourceFile ]]; then
        echo "No file named $sourceFileName found"
    else
        mv -- "$sourceFile" /home/cosmoretro/movie/"$destinationFileName"  
    fi
done

Что я сделал:

  • Используйте описательные имена, такие как destinationFileName вместо text2
  • Отступ правильно
  • Сделайте find только найти каталоги, указав -type d . Если вы хотите перемещать только файлы, используйте -type f вместо -type d .
  • Переместить перенаправление в конец команды, так как это не важно.
  • Прекратить find после того, как найден первый файл (-quit)
  • Удалите лишнее * в команде find - не уверен, что вы хотите с ним там. Если вы хотите, чтобы в именах файлов были символы подстановки (например, при поиске foo будет возвращен символ foobar), вам нужно поместить символ подстановки в кавычки, то есть "$sourceFileName*" .
  • Проверьте, был ли вообще найден файл с помощью теста -z если результат пуст.
  • Защитите mv от имен файлов, начинающихся с - используя опцию конца опций --
  • Правильно заключайте аргументы в кавычки, чтобы предотвратить пробел в команде (тогда не нужно менять IFS)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .