Como mover um arquivo se o nome da pasta contiver o nome do arquivo

1

Eu sou muito novo no shell de scripts no linux.

Eu tenho um monte de arquivos na fonte directory . Eu tenho que mover os arquivos para o destino directory onde a pasta deve conter o nome do arquivo (não correspondência exata).

Ex: Meu diretório de origem

/var/backup/
logstash-avi-core.spec
logstash-core.spec
ftpcore.spec

Meu diretório de destino

/path
/logstash-avi-core-2.2.0
/logstash-core-2.1.1
/ftpcore.spec-2.0

Eu escrevi um script baseado na referência, mas meu script não está funcionando. Os arquivos não são copiados para o diretório de destino

for path in /var/backup/${1}
do
    if [ -f "${path}" ]
    then
        filename="$(<<< "${file}" awk -F'.')"
        if [ -n "${filename}" ]
        then
            cp "${path}" "/path/${1}/"
        fi
    fi
done

Obrigado antecipadamente

Atualização conforme o esclarecimento nos comentários: Eu mencionei o diretório de destino "/path/${1}/" em cp "$ {path}" "/ path / $ {1} /". Eu quero ler o nome do arquivo do diretório de origem e eu tenho que procurar o nome de arquivo contendo nome do arquivo e precisa mover o arquivo para a pasta correspondente. Esta é minha exigência.

Update2 Eu modifiquei nomes de arquivos e diretórios.

    
por Mangoski 05.04.2016 / 17:23

1 resposta

1

Se bem entendi, você deseja levar os primeiros caracteres de cada nome de arquivo até a primeira letra que não é a letra e combiná-los com os primeiros caracteres do diretório de destino até o primeiro _ . Supondo que cada um desses padrões corresponda apenas uma vez, você pode fazer:

for file in /var/backup/*; do 
    fname=${file##*/}; 
    fname=${fname/.*/}; 
    cp -v "$file" /path/"$fname"*/; 
done

O resultado é:

$ ls /path/*
/path/adbs_32:
adbs.spec

/path/dmsx_ty_32:
dmsx.spec

/path/fomru_ts_td-45:
fomru32.spec

/path/gend_monitor:
gend.spec
    
por 06.04.2016 / 12:47