Encontre e desmarque arquivos marcados usando a comparação de strings?

0

No bash, eu tenho um script que usa loop while para copiar arquivos em uma determinada pasta para vários diretórios diferentes. Depois que cada arquivo é copiado, eu escrevi

mv $dir/$file $dir/_$file

usando _ no prefixo do arquivo para marcar que ele foi copiado. ( $dir é onde os arquivos são copiados.) No final do loop, o script lista os arquivos não marcados para mostrar quais não foram copiados.

Me deparei com um pequeno conflito em que alguns arquivos são copiados mais de uma vez para diretórios diferentes, mas não é possível copiar o arquivo novamente porque seu nome foi alterado.

Eu estava pensando em usar if [ $file -eq $dir/_$file ] , mas não é bom. O que é uma maneira simples de verificar um diretório para "_$file" given "$file" ?

Se houver um método melhor de fazer tudo isso, seria ótimo.

    
por obidyne 13.02.2018 / 23:31

4 respostas

0

Dado um arquivo que é expandido para $filename :

if [[ -f "dir/_${filename}" ]]; then
    echo "The prefixed copy exists."
else
    echo "The prefixed copy does not exist."
fi
    
por 13.02.2018 / 23:48
0

Estou vendo as respostas, mas também coloquei minha resposta. Talvez seja útil para alguém.

#!/bin/sh

filename="file"
directory="bash_test"

if [ "$filename" = "$(basename $directory/_$filename|tr -d ^_)" ]
then
    echo "Prefix exists."
else
    echo "Prefix not exists."
fi
    
por 14.02.2018 / 00:02
0

Consegui descobrir isso usando:

[ -f $dir/_$file ]

ou

if [ -f $dir/_$file ]; then

para simplesmente verificar a existência de um arquivo com o prefixo específico. Muito simples, tornei mais difícil do que o necessário.

Às vezes, não sei se devo ou não usar a citação sempre que fizer referência a variáveis.

    
por 13.02.2018 / 23:48
0

O teste com -eq falharia, pois os argumentos não são inteiros ( -eq testes para equivalência aritmética de dois inteiros).

O que você provavelmente quer fazer é verificar se o nome sublinhado já está sendo usado por outra coisa, não apenas por um arquivo normal.

Você pode fazer isso com

if [ -e "$dir/_$file" ]; then
    printf 'The name "%s" already exists in directory %s\n' "_$file" "$dir"
fi

Você precisaria do dobro das cotações em $dir/_$file , como mostrado acima, ou como "$dir"/_"$file" (contanto que $dir e $file sejam cotadas). Isso evita a divisão de palavras no valor das variáveis, o que, por sua vez, evita um erro de sintaxe de tempo de execução se um ou ambos, por algum motivo, contiverem caracteres de espaço em branco. Evita também invocar a geração de nome de arquivo (globbing) no diretório e no nome do arquivo.

Eu usei o teste -e porque suponho que você também gostaria de saber se existe, por exemplo, um diretório com o nome sublinhado no diretório $dir .

    
por 09.08.2018 / 11:37

Tags