2016-01-23 3 views
1

Я пытаюсь сравнить файлы в одном каталоге с другими. Давайте возьмем каталоги test 1 и test2. Если тест 1 содержит файл с именем 123.JPG, и если в тесте 2 содержится файл с именем 123.JPG.gpg, я бы тогда не принял никаких мер: 123.JPG уже зашифрован. Однако, если совпадение не было успешным, я бы запустил gpg для шифрования 123.JPG.скрипт bash для сравнения имен файлов в одном каталоге с именами файлов в другом при игнорировании расширений файлов

Я нашел этот сценарий в другом месте, которое я пытался изменить, чтобы достичь выше, но безрезультатно:

cd source 
for x in *; do 
    set -- "…/dest/${x%.*}".* 
    if [ $# -eq 1 ] && ! [ -e "$1" ]; then 
    echo "$x has not been converted" 
    elif [ $# -gt 1 ]; then 
    echo "$x has been converted to more than one output file: " "[email protected]" 
    else 
    echo "$x has been converted to $1" 
    fi 
done 

Может кто-нибудь, пожалуйста, помогите?

Спасибо

ответ

0

Если у вас есть ГНУ find, и вы можете использовать опцию printf, то follwing команда:

comm -23 <(find A -type f -printf '%f.gpg\n'|sort) <(find B -type f -printf '%f\n'|sort) 

даст вам список недостающих файлов:

Если каталог А означает:

A 
├── 123.JPG 
├── 456.JPG 
└── 789.JPG 

И справочник В:

B 
├── 123.JPG.gpg 
└── 456.JPG.gpg 

Выход будет 789.JPG.gpg что недостающее зашифрованный файл - это не существует в каталоге B, и файл с похожим именем, но без расширения, существует в директории А.

Затем вы можете использовать список результатов для шифрования отсутствующих файлов.

Обратите внимание: эта команда работает рекурсивно.

+0

Спасибо Рани. Когда я запускаю это, я получаю эту ошибку -ash: синтаксическая ошибка: неожиданная »(« Это потому, что я нахожусь на bash, а не zsh? – spesmagna

+0

№. Это должно работать на Bash. Проверьте, что вы используете ту же команду. –

+1

Сообщение об ошибке предполагает, что вы запускаете 'ash', что действительно не поддерживает это расширение синтаксиса, отличное от POSIX. – tripleee

1

Таким образом, для каждого файла X в каталоге test1, вы хотите проверить, существует ли файл с именем X.gpg в каталоге test2, а если нет, то выполнить команду GPG для создания файла в test2 ,

for source in test1/* 
do 
    target="test2/$(basename "$source").gpg" 
    if [ ! -f "$target" ] 
    then 
     …run gpg to encrypt "$source" into "$target"… 
    fi 
done 
+1

Небольшое уточнение: запустите 'gpg' как' gpg ... ... .TMP; mv .TMP '. «Mv» [несколько] атомный. Это предотвращает «отклонение»/«» от неправильного или частичного в случае сбоя системы, сбоя питания или прерывания сценария через «». Если произойдет какое-либо из этих событий, сценарий может быть повторно запущен, и он повторит частичные действия и завершит те, которые не были выполнены. –

+0

Спасибо, что помогли Джонатану. Однако, похоже, я не могу заставить это работать. Когда я запускаю этот скрипт, GPG завершает шифрование всех файлов. Так что даже если test1 содержит CIMG0614.JPG, и если test2 содержит CIMG0614.JPG.gpg, скрипт снова зашифровывает CIMG0614.JPG. Я понимаю, что делает этот скрипт, кроме этой части: if [! -f "target"]. Что именно это делает? – spesmagna

+1

@Jonathan Leffler Вероятно, это означает «$ target» вместо «target». [или тест - это тестовая команда POSIX. Он может выполнять простые тесты на файлах и строках. В bash вы должны использовать более мощные [[вместо этого и запретить [для согласованности. [[может сделать рисунок соответствия, быстрее и безопаснее использовать. http://mywiki.wooledge.org/BashGuide/TestsAndConditionals http://mywiki.wooledge.org/BashFAQ/031 –

Смежные вопросы