linux arquivos comuns entre duas pastas

1

Olá eu tenho dois diretórios, ambos contêm árvores de diretórios e arquivos. Se for possível, eu preciso de um script que verifique os arquivos comuns entre os diretórios e, se ele encontrar um arquivo comum, eu preciso deletá-lo em DIR2 e fazer um link para DIR1.

ex:

DIR1 includes dir abc1 , abc2, abc3 and abc1 contains file a.txt

DIR2 includes dir abc1 , abc4, and abc4 contains file a.txt 

Script should delete a.txt in DIR2/abc4 and make a link to DIR1/abc/a.txt

Este script seria preferível para estar em bash, awk, sed ou perl.

Obrigado!

    
por Marian 13.01.2016 / 08:47

4 respostas

3

Não há razão para escrever um arquivo de script, existem comandos para fazer isso sem script.

O comando diff irá mostrar as diferenças:

 diff -r dir1/ dir2/ 

( -r = Comparar recursivamente quaisquer subdiretórios encontrados, consulte o Manual ) imprimirá a lista dos arquivos que estão localizados apenas em qualquer diretório.

Se você também quiser verificar se os arquivos com o mesmo nome também são idênticos no conteúdo, use

diff --brief -r dir1/ dir2/

( --brief = Saída somente se os arquivos forem diferentes).

Se você quiser ver as diferenças também para arquivos que existem no diretório somente um , tratando suas contrapartes como vazias, você pode usar

diff --brief -Nr dir1/ dir2/

( -N = Tratar arquivos ausentes como vazios).

Se você quiser realizar a operação, o comando

cp -Rnl dir1/ dir2/

fará isso por você. Observe que -R = copiar diretórios recursivamente (novamente no Manual ), enquanto -n = não sobrescrever um arquivo existente.

    
por 13.01.2016 / 14:44
0

Existe um comando chamado tree que mostrará a estrutura do diretório.

Você pode canalizar isso para um arquivo de texto e fazer uma comparação a partir dele.

    
por 13.01.2016 / 14:29
0

Você deve ser capaz de fazer isso trivialmente no bash. O comando que você está procurando para fazer as comparações é md5sum ou diff .

Por exemplo, aqui está um script que compara apenas o md5sums de dois arquivos especificados na linha de comando:

#!/bin/bash

FILE_A="$1"
FILE_B="$2"

if [ "'md5sum $FILE_A | awk '{print $1}''" == "'md5sum $FILE_B | awk '{print $1}''" ] ; then
    echo "Same File"
else
    echo "Files Differ"
fi

Para percorrer a árvore de diretórios, você precisa usar a recursão. Aqui está um script de exemplo que escrevi há muito tempo atrás para renomear todos os arquivos com espaços no nome do arquivo para usar um sublinhado em vez de um espaço.

#!/bin/bash

rename 's/\ /_/g' ./*
currentdir='pwd'

### for all files and directories in the current directory.
for filename in 'ls' ; do
    ### if "filename" is a directory but not a softlink
    if [ -d $filename ] && ! [ -h $filename ] ; then
        cd "$filename"
        $0 ### This causes the script to call itself. Recursion!
        cd "$currentdir"
    fi
done

Em seguida, para criar links para arquivos entre os diretórios, use ln -s dir1/File1 dir2/ .

    
por 13.01.2016 / 09:13
0
comm -12 <(ls folder1 | sort) <(ls folder2 | sort)

comm imprime o resultado da comparação de dois arquivos. -12 diz para suprimir linhas exclusivas no arquivo 1 e no arquivo 2. Exprima apenas linhas comuns. <(...) ajuda a disponibilizar a execução do comando como um arquivo, substituição. Dentro das substituições, liste o conteúdo das pastas e classifique alfabeticamente.

É isso. Pode ser colocado em um script para encontrar todas as subpastas.

    
por 19.12.2016 / 12:34

Tags