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
ricedragon
fonte
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.

Paul
fonte
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.

daxelrod
fonte