Я пытаюсь написать скрипт, который находит определенный файл и перемещает его в папку.
#!/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
Мне даже читать этот сценарий тяжело. Могу ли я предложить вам немного его переписать?
#!/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
от имен файлов, начинающихся с ,-
используя опцию end of options--
- Правильно заключайте аргументы в кавычки, чтобы пробелы не нарушали работу команды (тогда нет необходимости что-либо менять
IFS
)