Excluir um diretório do comando `ls -R` no FreeBSD

Excluir um diretório do comando `ls -R` no FreeBSD

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 -Ie --ignorepara ls, mas Iapenas ignora o modo de superusuário e --ignorenão é compatível.

Alguém tem uma ideia de como usar lsou fazer isso usando outro comando (como grep)?

Responder1

Se você quiser listar todos os arquivos, exceto aqueles dentro de um determinado diretório, digamos, notHerevocê pode usar o findcomando para fazer isso como

find . -path ./notHere -prune -o -type f -print

Explicação:

  • .: o diretório para iniciar o findin
  • -path ./notHere: inicia uma regra que corresponda ao caminho./notHere
  • -prune: evita finddescer para o diretório com a correspondência atual
  • -o: adicione um orpara 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ões findainda 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. findgeralmente tem um recurso interno para ajudar com isso, embora não tenha opções específicas para ls. Você pode substituir o -printsinalizador acima por -lse ver se esse conjunto de lsopçõ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 findexecutar 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 -aopção (apenas nomes). Se quiser usar -aentão o mais simples é:

ls -la | grep -v skip_folder

onde skip_folderestá o nome que você deseja excluir. Use aspas se a pasta contiver espaços, por exemplo:

ls -la | grep -v "skip folder"

informação relacionada