Posso alimentar um script bash com um arquivo local em $ 1 e fazê-lo ecoar o caminho absoluto do arquivo? [duplicado]

9

Bastante auto-explicativo.

O primeiro argumento deve ser:

  • Verificado se o arquivo existe
  • Echo o caminho absoluto desse arquivo

Por exemplo:

+akiva@akiva-ThinkPad-X230:~$ ./myscript myfile.txt
/home/akiva/myfile.txt

Obrigado

    
por Akiva 14.03.2017 / 18:01

3 respostas

7

Se o seu script é

#!/bin/bash
[[ -e "" ]] && readlink -f -- ""

E tem permissão de execução ( chmod u+x scriptname ) Você pode inserir

./scriptname file

Para obter o caminho completo se o arquivo existir (embora esteja correto que o teste seja redundante se usarmos readlink -e e George está certo de usar realpath em vez de readlink )

Notas

  • [[ -e "" ]] teste se , o primeiro argumento do script, existe
  • && se isso acontecer (se o comando anterior foi bem sucedido) então faça o próximo comando
  • readlink -f -- "" imprime o caminho completo (para o arquivo real, mesmo que seja um link simbólico)

OP caracteres especiais solicitados são impressos com escapes. Deve haver uma maneira inteligente *, mas eu fiz assim (embora não lide com aspas simples - mas elas não podem ser ignoradas de qualquer maneira)

[[ -e "" ]] && readlink -f -- "" | sed -r 's/\||\[|\]| |!|"|$|%|\^|&|\*|\(|\)\{|\}|\#|@|\;|\?|<|>/\&/g'

Se são apenas espaços que você está preocupado, você pode fazer isso

sed 's/ /\ /g'

Isso obteria aspas simples (não muito úteis) e espaços

sed -r "s/'| /\\&/g"

Mas eu não acho que você pode pegar aspas simples e aspas duplas ...

* Aqui está a maneira inteligente, 100% de crédito para

[[ -e "" ]] && printf "%q\n" "$(readlink -f -- "")"
    
por Zanna 14.03.2017 / 18:12
8

Script não é necessário. Um único comando readlink é suficiente:

$ cd /etc/

$ readlink -e passwd
/etc/passwd

Do man readlink :

   -e, --canonicalize-existing
          canonicalize by following every symlink in every component
          of the given name recursively, all components must exist
    
por Sergiy Kolodyazhnyy 14.03.2017 / 18:11
7
#!/bin/bash

[[ -e "" ]] && echo realpath -e ""

Atualize para cuidar de caracteres não alfanuméricos:

#!/bin/bash

[[ -e "" ]] && echo "" | sed -r 's/[^a-zA-Z0-9\-]/\//g' | realpath -e ""

Prepare o script: chmod +x script_name e, em seguida,

use: ./script_name filename

Informação:

  1. [[ -e "" ]] : verifique se o arquivo passado existe .
por George Udosen 14.03.2017 / 18:20