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
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.
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
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
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.
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
.