2

Здравствуйте, у меня есть 2 каталога, оба они содержат деревья каталогов и файлов. Если это возможно, мне нужен скрипт, который проверяет общие файлы между каталогами, и если он находит общий файл, мне нужно удалить его в DIR2 и сделать ссылку на DIR1.

например:

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

Этот скрипт предпочтительнее использовать в bash, awk, sed или perl.

Спасибо!

4 ответа4

4

Нет причин писать файл скрипта, есть команды, которые делают это без скриптов.

Команда diff покажет вам различия:

 diff -r dir1/ dir2/ 

(-r = Рекурсивно сравнивать любые найденные подкаталоги, см. Руководство) распечатает список файлов, которые находятся только в любом каталоге.

Если вы также хотите проверить, идентичны ли файлы с одинаковыми именами по содержанию, используйте

diff --brief -r dir1/ dir2/

(--brief = выводить только те файлы, которые отличаются).

Если вы хотите увидеть различия также для файлов, которые существуют только в одном каталоге, рассматривая их аналоги как пустые, вы можете использовать

diff --brief -Nr dir1/ dir2/

(-N = обрабатывать отсутствующие файлы как пустые).

Если вы хотите выполнить операцию, команда

cp -Rnl dir1/ dir2/

сделаю это для вас. Обратите внимание, что -R = копировать каталоги рекурсивно (снова из Руководства), а -n = не перезаписывать существующий файл.

0

Вы должны быть в состоянии сделать это тривиально в Bash. Командой, которую вы ищете для сравнения, является md5sum или diff .

Например, вот скрипт, который просто сравнивает md5sums двух файлов, указанных в командной строке:

#!/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

Для обхода дерева каталогов вам нужно использовать рекурсию. Вот пример сценария, который я написал давным-давно, чтобы переименовать все файлы с пробелами в имени файла, чтобы использовать подчеркивание вместо пробела.

#!/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

Затем для создания ссылок на файлы между каталогами используйте ln -s dir1/File1 dir2/ .

0
comm -12 <(ls folder1 | sort) <(ls folder2 | sort)

comm выводит результат сравнения двух файлов. -12 говорит, что подавляет уникальные строки в файле 1 и файле 2. т.е. печатает только общие строки. <(...) помогает сделать выполнение команды доступным в виде файла подстановки. Внутри подстановок перечислите содержимое папок, затем сортируйте по алфавиту.

Вот и все. Можно вставить в скрипт, чтобы найти для всех подпапок.

0

Существует команда с именем tree которая выведет структуру каталогов.

Вы можете передать это в текстовый файл, а затем сделать сравнение по нему.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .