LINUX.ORG.RU

Помощь по скрипту BASH

 


0

1

Приветствую!

Написал такую конструкцию:

find -maxdepth 1 -type f -regex '.*\(jpg\)' | grep -oE '[^/]+.$' | cut -d'.' -f1 > /tmp/JPG_F
find .. -maxdepth 1 -type f -regex '.*\(pp3\|CR2\)' | grep -oE '[^/]+.$' | cut -d'.' -f1 > /tmp/CR2_F
grep -vFf /tmp/JPG_F /tmp/CR2_F > /tmp/RM_Files.txt
old_IFS=$IFS; IFS=$'\n'
for RM in $( </tmp/RM_Files.txt ); do rm ../$RM* > /dev/null 2>&1; done
IFS=$old_IFS

Смысл в том, что:

1) ищутся в текущей директории файлы с расширением jpg, затем записываются в файл только имена

2) ищутся в директории на уровень выше файлы с расширением pp3 и CR2, затем записываются в файл только имена

3) выявляются на основе первого файла «лишние» файлы во втором каталоге (несовпадающие с именами в первом), затем записываются в файл

4) удаляются файлы из созданного списка отличий

Чего хочется - уйти от перенаправлений в файлы. Что-то вроде

1) тут понятно - A=`find -maxdepth 1 -type f -regex '.*\(jpg\)' | grep -oE '[^/]+.$' | cut -d'.' -f1`

2) тут понятно - B=`find .. -maxdepth 1 -type f -regex '.*\(pp3\|CR2\)' | grep -oE '[^/]+.$' | cut -d'.' -f1`

3) вот тут засада, понимаю что бред, но смысл - C=`grep -vFf «$A» «$B»`

4) ну и old_IFS=$IFS; IFS=$'\n' for RM in $С; do rm ../$RM* > /dev/null 2>&1; done IFS=$old_IFS

Спасибо за любую помощь!

получше выглядит: combine <(cmd1) not <(cmd2), но нужен moreutils и баш

как хак: { cmd1 | tee -; cmd2; } | sort | uniq -u (может вместо cmd1 должна быть cmd2, лень вчитываться

anonymous ()
#!/bin/bash

declare -A L1

for l in *.jpg ; do
        [ -f "$l" ] && L1[${l%.jpg}]=1
done

for l in ../*.pp3 ../*.CR2 ; do
        if [ -f "$l" ]; then
                f=${l#../}
                f=${f%.*}
                if [ -z "${L1[$f]}" ] ; then
                        echo rm "$l"
                fi
        fi
done
vodz ★★★★★ ()

выявляются на основе первого файла «лишние» файлы во втором каталоге (несовпадающие с именами в первом), затем записываются в файл

while read FN ; do 
  if [ ! -f "${FN%.*}jpg" ] ; then
    rm -f ../"${FN%.*}".{pp3,CR2} 
  fi
done <(find .. -type f \( -name '*.pp3' -o -name '*.CR2' \))
redgremlin ★★★★★ ()
Ответ на: комментарий от redgremlin

тут забыли удалить ../

if [ ! -f «${FN%.*}jpg» ] ; then

забыли точку

rm -f ../«${FN%.*}».{pp3,CR2}

может таки rm «$FN» ?

done <(find

забыли <

vodz ★★★★★ ()
Ответ на: комментарий от sin_a

Огромное спасибо! это то, что нужно!

Огромное спасибо!

Pashtet ()

Спасибо!

Всем спасибо! Для дела буду использовать вариант уважаемого sin_a, Он мне ближе всего. Но для развития, проработаю все варианты. Спасибо!

Pashtet ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.