Estou tentando escrever um script bash. Neste script, quero que o usuário insira o caminho de um diretório. Em seguida, quero acrescentar algumas strings no final dessa string e construir um caminho para alguns subdiretórios. Por exemplo, suponha que o usuário insira uma string como esta:
/home/user1/MyFolder
Agora eu quero criar 2 subdiretórios neste diretório e copiar alguns arquivos para lá.
/home/user1/MyFolder/subFold1
/home/user1/MyFolder/subFold2
Como posso fazer isso?
Respostas:
O padrão POSIX determina que vários
/
sejam tratados como um único/
em um nome de arquivo. Assim//dir///subdir////file
é o mesmo que/dir/subdir/file
.Assim, concatenar duas strings para construir um caminho completo é tão simples como:
fonte
"" + "/" + "Documents"
dá"/Documents"
../
à frente. Mas talvez o usuário queira concatenar caminhos absolutos. Caso contrário, eles poderiam simplesmente adicionar./
à frente para forçar o caminho a ser relativo. Observe também que"$path1/./$path2"
é o mesmo que"$path1/$path2"
.E se você quiser usar readline para obter a conclusão e tudo mais, adicione um
-e
à chamada pararead
:fonte
Simplesmente concatenar a parte do seu caminho não vai conseguir o que você deseja?
Você pode então criar as pastas / diretórios conforme necessário.
Uma convenção é terminar os caminhos do diretório com
/
(por exemplo/home/
) porque os caminhos que começam com / podem ser confundidos com o diretório raiz. Se uma barra dupla (//
) for usada em um caminho, também estará correto. Mas, se nenhuma barra for usada em nenhuma das variáveis, seria incorreto (por exemplo/home/user1/MyFoldersubFold1
).fonte
/home/user1/MyFolder/subFold1
então você precisaria embutirnew_path=$base/$subdir
. Mas então o que você faz se o caminho fornecido inclui um final '/'?newpath=$base/$subdir/
você pode brincar com isso diretamente na linha de comandoO script a seguir catena vários caminhos (relativos / absolutos) (BASEPATH) com um caminho relativo (SUBDIR):
O resultado é:
O
shopt -s extglob
é necessário apenas para permitir que BASEPATH termine em várias barras (o que provavelmente é um absurdo). Sem o globing estendido, você pode apenas usar:o que resultaria em menos organizado, mas ainda funcionando:
fonte
Eu estava trabalhando com meu script de shell que precisa fazer algumas coisas de path join como você faz.
A questão é que ambos os caminhos gostam
é válido.
Se eu quiser anexar um arquivo a este caminho, como
não havia nenhum método nativo (como os.path.join () em python) no shell para lidar com tal situação.
Mas eu encontrei um truque
Por exemplo, o caminho base foi armazenado em uma variável shell
e o último nome de arquivo do qual você deseja entrar era
Então você pode atribuir seu novo caminho assim
e então você obterá
o motivo é bastante simples, o comando "realpath" sempre cortaria a barra de encerramento para você, se necessário
fonte
fonte
Isso deve funcionar para um dir vazio (você pode precisar verificar se a segunda string começa com a
/
qual deve ser tratada como um caminho absoluto?):Resultado:
Referência: Expansão de Parâmetros de Shell
fonte