Como mover o arquivo com base na expressão do nome do arquivo usando o shell script?

3

Eu quero conseguir o seguinte usando um script de shell. Quando um script é chamado com um arquivo como um parâmetro, ele deve mover o arquivo com base em uma parte de seu nome.

Por exemplo, "Cotações de seguro automóvel_zz21.pdf" para ordenar em 21.Car seguro (uma sub-pasta de FilingCab) "2012-09-01 Home insurance quote_zz20.pdf" para classificar em 20.Asseguro residencial (uma subpasta da FilingCab)

Logicamente, acho que deveria ler algo assim. Eu fiz programação há muito tempo atrás, então eu acho que tem o algoritmo, mas não tem os comandos ou a sintaxe.

Obrigado por ajudar!

FileToMove = $1
FolderNo = (The number after zz and before a .)
ParentFolder = (~/FilingCab)
FolderList = (List of all folders in ParentFolder) 
TargetFolder = (Folder among FolderList that begins with FolderNo) - use grep?

if TargetFolder <> not empty
         cd ParentFolder
         mv FileToMove to TargetFolder
end with success
else
         do nothing
endif

end script
    
por jim70 01.09.2012 / 15:15

1 resposta

2

Tente algo assim:

#! /bin/bash

# Config variable(s)
ParentFolder="~/FilingCab"

# arg processing (minimalist :)
FileToMove="$1"

# use sed to extract folder number from filename.
FolderNo=$(echo "$FileToMove" | sed -r -e 's/.*zz([0-9]+)\.pdf//')

# use find to search for subdirectories of parent folder that begin
# with the folder no followed by a '.'
TargetFolder=$(find "$ParentFolder" -maxdepth 1 -type -a -d -name "${FolderNo}.*")

NumFolders=$(echo "$TargetFolder" | wc -l)

if [ "$NumFolders" -eq 1 ] ; then 
 mv "$ParentFolder/$FileToMove" "$TargetFolder/" 
else
  echo "Error: $NumFolders beginning with "$FolderNo." found" >&2
  exit 1
fi

Observe as aspas duplas em torno de todos os nomes de variáveis. É sempre a coisa certa / segura para fazer, mas no seu caso é essencial porque os nomes de arquivos e diretórios que você deu como exemplos possuem caracteres de espaço.

O -maxdepth 1 no comando find procura apenas por subdiretórios diretos de $ ParentFolder (isto é, ignora subdiretórios de subdiretórios). Se não foi isso que você quis dizer, apenas remova essa parte. Este find procura por subdiretórios de $ ParentFolder que começam com $ FolderNo.

Eu não tenho certeza do que você quer dizer com "se TargetFolder não for igual a não vazio", eu estou supondo que você quis dizer "é a string $ TargetFolder não vazia". Normalmente, eu verificaria se o $ TargetFolder existia e era um diretório, mas como estamos obtendo o nome do diretório de um find -type d , ele só pode estar vazio ou em um diretório. ou talvez mais, se houver mais de um começo com "$ FolderNo".

Acho melhor verificar se obtemos um e exatamente um resultado da descoberta. Qualquer outro valor é um erro e não podemos mover o arquivo. 0 significa que nenhuma pasta correspondente foi encontrada. 2 ou mais significa mais de uma pasta começando com "$ FolderNo". foi encontrado.

A mensagem de aviso para stderr é opcional. assim é o exit 1 , mas recomendado. Ele permite que você chame esse script de outro script e verifique se ele foi bem-sucedido ou não.

    
por 01.09.2012 / 17:12