Imprima o comum dos dois arquivos


0

Quero imprimir o comum do arquivo 2

Um arquivo contém o ls -l opção e o outro tem o ls opção

ls só tem o nome do arquivo ls -l tem tudo, incluindo a permissão e outras informações.

Existe uma maneira de eles imprimirem a saída do arquivo comum? O comando comm não parece funcionar (imprime tudo)

eu tentei grep -f file1 file2 mas nada aparece

vamos dizer o ls -l saída é

-rwx------ 1 username 230 date and the filename

ls é

filname

Eu estou tentando obter o nome do arquivo aka a união do arquivo 2. Eu não acho que há uma maneira de ler o diretório do nome do arquivo no shell

eu quero o

filename

Você pode por favor esclarecer o que você está tentando fazer? Você está tentando encontrar a união de nomes de arquivos listados em ambos os arquivos?
daxelrod

@daxelrod modificou o primeiro post acima
ricedragon

Respostas:


1
for i in ls-file; do grep -e $i$ ls-l-file; done

Isso faz um loop em cada linha ls-file (contendo apenas o comando ls) e atribui a saída para $ i. Em seguida, ele ls-l-file (contendo o comando ls -l) e procura por uma correspondência e gera a saída.

Atualizar

for i in ls-file; do grep -eo $i$ ls-l-file; done

O parâmetro -o só mostrará o texto correspondente, então apenas o nome do arquivo

Atualização 2

while read i; do  grep -oe $i$ ls-l-file; done < ls-file

Isso funciona melhor.


1
Infelizmente, isso não funcionará corretamente se um nome de arquivo for igual ao nome de um proprietário ou grupo de um arquivo em ls-l-file, por exemplo.
daxelrod

1
Bom ponto. Eu editei para combinar apenas o final de uma linha
Paul

oh isso funciona como um charme, eu estou tentando comm e diff, e todos os tipos de comando grep o dia todo
ricedragon

0

Você é parte do caminho até lá.

A primeira coisa que você precisa é extrair apenas os nomes de arquivo do arquivo que contém ls -l saída, você pode fazer isso com

awk '{print $9}' < lsl_file

No meu sistema operacional, o nome do arquivo é a 9ª coluna, é possível que seja uma coluna diferente na sua.

Observe que comm requer que ambos os arquivos sejam classificados, isso já deve ser o caso com a saída de ls e ls -l.

Portanto, o seu one-liner seria:

awk '{print $9}' < lsl_file | comm - ls_file

O argumento de traço único para comm diz para usar STDIN.

Suposição importante : isso pressupõe que seus nomes de arquivos não possuam espaços neles.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.