C-like strings e $ 'string'
Entre outras coisas, pode-se usar o tipo de cotação $'...'
para usar os caracteres de barra invertida ANSI-C, como \n
e \t
, incluindo aqueles que você mencionou. Do manual do bash 4.3:
% bl0ck_qu0te%
Isto é particularmente útil em arquivos que contêm novas linhas, abas, quando você está escrevendo linhas complexas de awk, onde você precisa usar diferentes maneiras de distinguir entre aspas simples e duplas, quando os próprios nomes de arquivos contêm mix simples / duplo etc.
Por exemplo, criar e listar esses arquivos:
$ touch a$'*'b c$'\n'd
$ ls a$'*'b c$'\n'd
a*b c?d
Você pode fazer uso de valores hexadecimais de caracteres, como:
$ touch 'file(name'
$ ls file$'\x28'name
file(name
printf
Mesma ideia de antes - aproveite os caracteres de escape:
$ ls "$(printf "file\x28name")"
file(name
$ echo "Hello World" > c$'\n'd
$ cat "$(printf "c\nd")"
Hello World
Use inodes:
Cada arquivo ou diretório tem uma estrutura de dados especial associada a ele, chamada inode, que é referenciada por um número decimal específico. Assim, você pode usar isso para localizar indiretamente o arquivo com um inode específico por meio do comando find
e fazer algo com ele:
$ echo "This is a test" > file$'('name1
$ ls -i
5898996 file(name1 5898997 file?name2
$ find -type f -inum "5898996" -exec cat {} \;
This is a test
Evite lidar com arquivos individuais quando você pode usar glob
Quando você não precisa lidar com arquivos individuais, apenas aproveite o *
glob character no shell e cite variáveis ao passá-los para outros comandos. Faz com que lidar com nomes de arquivo difíceis seja muito mais fácil:
$ for f in ./*; do echo "$f" ; done
file name2
file(name1
Observe o uso de ./
- uma proteção contra nomes de arquivos que podem conter -
inicial neles.