localize o comportamento do comando ao corresponder nomes sem aspas

3

Eu estava procurando diferenças no comando find com aspas duplas e sem aspas.

Eu encontrei algo estranho. Eu tenho dois arquivos:

  • xWrapper.java
  • YWrapper.java

e alguns no padrão *Wrapper.java .

eu corri

find . -name *Wrapper.java

que deve retornar o primeiro arquivo que corresponde ao padrão, porque o comando se expande como

find . -name xWrapper.java yWrapper.java ..

Mas, como resultado, recebi todos os arquivos desse formulário. Por que ele retornou todos os arquivos correspondentes a esse padrão?

    
por spreethegr8 31.07.2012 / 09:13

3 respostas

7

Se houver algo, você deverá receber uma mensagem de erro se estiver no mesmo catálogo:

~$ mkdir test
~$ cd test
~/test$ touch {X,Y}Wrapper.java
~/test$ find . -name *Wrapper.java
find: paths must precede expression: YWrapper.java
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]

desde que o asterisco será expandido e -name aceita apenas um único argumento.

Se você vem de um local onde o asterisco não é expandido:

~/test$ cd ..
~$ find test -name *Wrapper.java
test/XWrapper.java
test/YWrapper.java

Como o asterisco agora não é expandido (desde que não corresponda a nada no diretório atual), find o vê "como está" e o usa como curinga. / p>

Você deve agrupar o argumento -name entre aspas simples para evitar esse comportamento dependente do contexto:

~/test$ find . -name '*Wrapper.java'
./XWrapper.java
./YWrapper.java
    
por 31.07.2012 / 09:19
0

Você pode usar a função or porque -name é um argumento de string único.

find . \( -name "xWrapper.java" -o -name "yWrapper.java" \)

Ou você pode usar o regex para encontrar o arquivo com

find . -regex '.*\(x\|y\)Wrapper.java'
    
por 31.07.2012 / 09:31
0
[max@localhost ~]$ touch 1file
[max@localhost ~]$ touch 2file
[max@localhost ~]$ touch 3file
[max@localhost ~]$ touch 4file
[max@localhost ~]$ touch 5file
[max@localhost ~]$ find -name "*file"
./4file
./2file
./Desktop/new file
./Desktop/DESKTOP/new file
./.bash_profile
./#file
./3file
./1file
./5file
./file
./file/file

Isso corresponderá a todo o nome do arquivo que termina com file

[max@localhost ~]$ find . -name 'file*'
./file1
./.gconf/apps/file-roller
./Downloads/opera-10.60-6386.i386.linux/share/opera/unite/fileSharing.ua
./Downloads/opera-10.60-6386.i386.linux/share/opera/defaults/filehandler.ini
./Downloads/opera-10.60-6386.i386.linux/share/opera/styles/images/file.png
./.gnome2/file-roller
./.local/share/Trash/files
./file
./file/file2
./file/file

Isso corresponderá a todo o nome do arquivo que está sendo exibido com file

[max@localhost ~]$ find -name "1file"
./1file

Isso corresponderá apenas ao nome do arquivo 1file

[max@localhost ~/avi]$ touch a
[max@localhost ~/avi]$ touch b
[max@localhost ~/avi]$ touch "a b"
[max@localhost ~/avi]$ ll
total 0
-rw-rw-r-- 1 max max 0 Jul 31 13:49 a
-rw-rw-r-- 1 max max 0 Jul 31 13:49 a b
-rw-rw-r-- 1 max max 0 Jul 31 13:49 b
[max@localhost ~/avi]$ find . -name a
./a
[max@localhost ~/avi]$ find . -name b
./b
[max@localhost ~/avi]$ find . -name a b
find: paths must precede expression: b
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] 
[expression]
[max@localhost ~/avi]$ find . -name "a b"
./a b

("ou ') símbolo será útil quando houver um espaço entre o nome do arquivo como" a b "

    
por 31.07.2012 / 10:14