Estou tentando escrever um script de shell que encontre um arquivo específico e o mova para uma pasta.
#!/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
Mas ele também move arquivos se houver um arquivo igual à pasta que procuro.
Tudo que eu quero é apenas mover a pasta.
Responder1
Estou tendo dificuldades até para ler esse script. Posso sugerir que você reescreva um pouco?
#!/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
O que eu fiz:
- Use nomes descritivos como
destinationFileName
em vez detext2
- Recuar corretamente
- Faça
find
apenas encontrar diretórios especificando-type d
. Se você quiser mover apenas arquivos, use-type f
em vez de-type d
. - Mova o redirecionamento para o final de um comando, pois não é importante
- Pare
find
depois de encontrar o primeiro arquivo (-quit
) - Remova o supérfluo
*
dofind
comando - não tenho certeza do que você deseja com ele. Se você deseja que os nomes de arquivos tenham curingas (por exemplo, a pesquisafoo
retornariafoobar
), então você precisa colocar o curingaemas aspas, ou seja"$sourceFileName*"
. - Verifique se algum arquivo foi encontrado testando
-z
se o resultado estiver vazio. - Proteja-se
mv
contra nomes de arquivos começando-
usando a opção de fim de opções--
- Cite os argumentos corretamente para evitar que os espaços em branco quebrem o comando (não há necessidade de alterar
IFS
então)