Como você passa um arquivo ou pasta contendo espaço em branco como um argumento para um programa de linha de comando em um ambiente GNU / Linux ou Cygwin?

1

Há ocasiões em que você está trabalhando com arquivos e pastas que contêm espaços neles. O problema é que, sempre que você tentar enviar arquivos / pastas contendo espaço em branco para outro programa de linha de comando, os arquivos / pastas que contêm espaço em branco serão interpretados como argumentos separados, e não como um único argumento. Por exemplo, considere a seguinte árvore de diretórios:

Folder With Spaces
Folder With Spaces/FolderWithoutSpaces
Folder With Spaces/FolderWithoutSpaces/file with spaces.txt
FolderWithoutSpaces
FolderWithoutSpaces/fileWithoutSpaces.txt

Se você tentar e executar um comando shell como "grep 'algum texto' $ (find. -type f)", você obterá a seguinte saída:

grep: ./Folder: No such file or directory
grep: With: No such file or directory
grep: Spaces/FolderWithoutSpaces/file: No such file or directory
grep: with: No such file or directory
grep: spaces.txt: No such file or directory

A grande questão é, como você canaliza arquivos / pastas que têm espaços em branco neles como argumentos para um programa de linha de comando?

    
por rmiesen 29.06.2013 / 00:59

4 respostas

7

Seria melhor usar a -exec action (opção) de find e citando seus argumentos.

Exemplo:

find . -type f -exec grep stuff '{}' \;

As aspas impedirão que os espaços sejam interpretados e você não precisará canalizar tudo através de xargs desnecessariamente.

Na página find man:

-exec command ;

    Execute command; true if 0 status is returned. All following arguments to find are taken to be arguments to the command until an argument consisting of  ‘;’  is encountered. The string  ‘{}’  is replaced by the current file name being processed everywhere it occurs in the arguments to the command, not just in arguments where it is alone, as in some versions of find.  Both of these constructions might need to be escaped (with a  ‘\’) or quoted to protect them from expansion by the shell. See the EXAMPLES section for examples of the use of the -exec option. The specified command is run once for each matched file. The command is executed in the starting directory.

    There are unavoidable security problems surrounding use of the -exec action; you should use the -execdir option instead.

    
por 29.06.2013 / 01:32
3

Canalize seus argumentos usando xargs, delimitando seus argumentos de linha de comando no programa anterior com um caractere nulo passando a opção "-0" para xargs, como segue:

find . -type f -print0 | xargs -0 grep -l "some text"

Este comando passará em quaisquer arquivos / pastas com espaços em branco neles como argumentos únicos em vez de argumentos separados.

    
por 29.06.2013 / 01:03
2

Use o caractere de barra invertida '\' anterior ao espaço em branco:

[randerson@localhost ~]$ mkdir Folder\ With\ Spaces
[randerson@localhost ~]$ ls | grep Folder\ With\ Spaces
Folder With Spaces
[randerson@localhost ~]$ 
    
por 29.06.2013 / 01:12
1

Coloque os nomes dos arquivos entre aspas (simples ou dupla):

$ mkdir "Folder With Spaces"
$ ls | grep "Folder With Spaces"
Folder With Spaces
$ ls | grep 'Folder With Spaces'
Folder With Spaces

O shell expandirá as variáveis entre aspas duplas:

$ FOO=With
$ ls | grep "Folder $FOO Spaces"
Folder With Spaces

Você também pode citar $(...) expansions se o resultado for um único nome de arquivo:

$ ls -d "$(echo -n Folder With Spaces)"
Folder With Spaces

Isso só funcionará para nomes de arquivos únicos; para vários arquivos, use find -exec ou xargs conforme sugerido nas outras respostas.

    
por 29.06.2013 / 01:30