ls * .csv --ignore = “* padrão *” retorna arquivos que contêm “padrão”

7

Por que ls --ignore não está ignorando o padrão?

Olhando para o exemplo abaixo:

mkdir books
cd books
touch books_abby.csv
touch books_karen.csv
touch books_david.csv
touch books_tom.csv

Isso cria quatro arquivos:

$ ls
books_abby.csv  books_david.csv  books_karen.csv  books_tom.csv

Se, no entanto, você quiser ignorar todo o nome do arquivo que contém "tom" e listá-los, books_tom.csv ainda será retornado:

$ ls *.csv --ignore="*tom*"
books_abby.csv  books_david.csv  books_karen.csv  books_tom.csv

O resultado esperado é que arquivos contendo "tom" sejam omitidos:

$ ls *.csv --ignore="*tom*"
books_abby.csv  books_david.csv  books_karen.csv
    
por Greg 29.10.2017 / 10:14

1 resposta

9

O sinalizador é descrito na página ls man como

do not list implied entries matching shell PATTERN

Assim que você nomear explicitamente um arquivo ou um padrão correspondente a um arquivo, o arquivo não estará mais implícito, por definição. No seu exemplo, books_tom.csv é explicitamente referenciado por meio do padrão de correspondência *.csv . Com ls --ignore="*tom*" , no entanto, todos os arquivos no diretório estão implícitos, portanto, books_tom.csv não será mais exibido.

Se você tiver o alargado de globbing disponível no seu shell (com o bash você pode ativar com shopt -s extglob ) você pode conseguir o que você deseja criando um padrão que excluirá 'tom'. Por exemplo, ls books_!(tom).csv mostraria books_abby.csv , mas não books_tom.csv .

(É claro, você pode usar outras ferramentas como find , pipe para grep -v , etc ... Estou explicando como fazer isso apenas com ls .)

    
por 29.10.2017 / 10:19