Eu gostaria de executar o oposto de:
find . -name "*2013*"
Encontre todos os arquivos no diretório atual que não contenham a cadeia "2013" em seus nomes. Como eu posso fazer isso?
Eu gostaria de executar o oposto de:
find . -name "*2013*"
Encontre todos os arquivos no diretório atual que não contenham a cadeia "2013" em seus nomes. Como eu posso fazer isso?
Respostas:
Simplesmente:
find . ! -name '*2013*'
Adicione a ! -type d
para excluir também os arquivos do diretório de tipos (como .
ele próprio) ou -type f
para incluir apenas arquivos regulares , excluindo todos os outros tipos de arquivos (diretórios, fifos, links simbólicos, dispositivos, soquetes ...).
Cuidado, porém, que *
corresponda a uma sequência de 0 ou mais caracteres . Portanto, ele poderia relatar nomes de arquivos que contenham 2013
se isso 2013
foi precedido ou seguido por algo que não pode ser totalmente decodificado como caracteres válidos no código de idioma atual.
Isso pode acontecer se você estiver em uma localidade em que os caracteres possam ser codificados em mais de um byte (como em UTF-8) para nomes de arquivos codificados em uma codificação diferente. Por exemplo, em um código de idioma UTF-8, ele reportaria um Stéphane2013
arquivo se esse é
tivesse sido codificado no conjunto de caracteres iso8859-15 (como o byte 0xe9).
O melhor seria garantir que os nomes dos arquivos sejam codificados no conjunto de caracteres da localidade, mas se você não puder garantir isso, uma solução alternativa será executar find
na localidade C:
LC_ALL=C find . ! -name '*2013*'
Os padrões de nome de arquivo Ksh são suficientes:
# files with 2013
ls -d -- *2013*
# files without 2013
ls -d -- !(*2013*)
Se o seu shell for bash, você precisará executar shopt -s extglob
antes de poder usar esse padrão (você pode colocá-lo no seu .bashrc
). Se o seu shell for zsh, você precisará executar setopt ksh_glob
(você pode colocá-lo no seu .zshrc
). O Zsh também oferece ls -d -- ^*2013*
, o que requer uma preliminar setopt extended_glob
.
Dependendo do que você está fazendo com esses nomes de arquivos, ls
pode não ser o comando certo a ser usado. Para armazená-los em uma matriz
filenames=( !(*2013*) )
for f in "${filenames[@]}"; do ...; done
Encontre todos os arquivos no diretório atual que não contém uma determinada string, aqui "2013":
find . ! -name "*2013*" -type f
ls
retornará uma mensagem de erro se o padrão não corresponder a nenhum arquivo). Observe também queksh
irá classificar a lista.