
Quero listar todos os meus arquivos em um diretório no FreeBSD 9.2, mas não quero incluir um diretório específico. Verifiquei os parâmetros -I
e --ignore
para ls
, mas I
apenas ignora o modo de superusuário e --ignore
não é compatível.
Alguém tem uma ideia de como usar ls
ou fazer isso usando outro comando (como grep
)?
Responder1
Se você quiser listar todos os arquivos, exceto aqueles dentro de um determinado diretório, digamos, notHere
você pode usar o find
comando para fazer isso como
find . -path ./notHere -prune -o -type f -print
Explicação:
.
: o diretório para iniciar ofind
in-path ./notHere
: inicia uma regra que corresponda ao caminho./notHere
-prune
: evitafind
descer para o diretório com a correspondência atual-o
: adicione umor
para especificar o que queremos que aconteça se a primeira regra não corresponder-type f
: corresponde apenas a arquivos, não, digamos, diretórios (remova isso se quiser ver as entradas do diretório também)-print
: muitas vezes não é necessário porque é a ação padrão, mas algumas versõesfind
ainda desejam que você diga expressamente que deseja que o resultado seja impresso
Você mencionou querer outra saída (especificamente ls -ll
) além da lista de nomes de arquivos. find
geralmente tem um recurso interno para ajudar com isso, embora não tenha opções específicas para ls
. Você pode substituir o -print
sinalizador acima por -ls
e ver se esse conjunto de ls
opções é próximo o suficiente para você:
find . -path ./notHere -prune -o -type f -ls
ou se isso não for bom o suficiente, você poderia find
executar o comando desejado em vez de tentar processar a saída separadamente, como:
find . -path ./notHere -prune -o -type f -exec ls -ll {} +
Responder2
Eu uso este script para filtrar todas as pastas com nomes começando com '_'. Provavelmente não funcionará com pastas que possuem espaços, mas você pode alterá-lo.
#!/bin/sh
A=`ls /j/ | xargs | sed 's/_[a-z0-9]*//g' | awk '{$1=$1;print}'`
W=`echo $A | wc -w | tr -d '[[:space:]]'`
echo $W
Em geral a parte interessante é esta:
ls some_folder | xargs | sed 's/_[a-z0-9]*//g'
A regex _[a-z0-9]*
contém o padrão para corresponder ao nome que deve ser excluído.
Isso se você quiser listar pastas sem a -a
opção (apenas nomes). Se quiser usar -a
então o mais simples é:
ls -la | grep -v skip_folder
onde skip_folder
está o nome que você deseja excluir. Use aspas se a pasta contiver espaços, por exemplo:
ls -la | grep -v "skip folder"