перебрать каталог и проверить, существует ли он в другом каталоге - PullRequest
0 голосов
/ 02 октября 2018

У меня есть папка с 20000 файлами в каталоге A и другая папка с 15000 файлами в другом каталоге B. Я могу перебрать каталог, используя:

DIR='/home/oracle/test/forms1/'

for FILE in "$DIR"*.mp
do
   filedate=$( ls -l --time-style=+"date %d-%m-%Y_%H-%M" *.fmx |awk  '{print $8 $7}')
    echo "file New Name $FILE$filedate "
#    echo "file New Name $FILE is copied "
done

Мне нужно перебрать все файлы в каталогеA и проверьте, существуют ли они в каталоге B

Я попробовал следующее, но это не сработало:

testdir='/home/oracle/ideatest/test/'
livedir='/home/oracle/ideatest/live/'

for FILET in "$testdir" #
do
    testfile=$(ls $FILET)
    echo $testfile

    for FILEL in "$livedir"
    do
        livefile=$(ls $FILEL)

        if [ "$testfile" = "$livefile" ]
        then
            echo "$testfile"
            echo "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy"
        else
            echo "nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn"
        fi
    done
done

Я пытаюсь исправить результат летплохого контроля версий у нас есть тот самый oly-скрипт, который отправляет форму в живую среду, но каждый раз, когда она компилируется и отправляется, живая версия именуется как (testform.fmx), но в test dir есть примерно 10 файлов, названных как (testform.fmx01)-12-2018) (testform.fmx12-12-2017) (testform.fmx04-05-2016) в результате мы потеряли трек последнего источника, отправленного в живую среду, поэтому я создал этот

filedate=$( ls -l --time-style=+"date %d-%m-%Y_%H-%M" *.fmx |awk 
'{print $8 $7}')
echo "file New Name $FILE$filedate " 

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

Ответы [ 3 ]

0 голосов
/ 02 октября 2018

Вы можете просто использовать команду diff для сравнения файлов и каталогов.diff folderA folderB Я думаю, вам не нужно использовать цикл для этого ..

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

#!/bin/bash
DIR1="/home/A"
DIR2="/home/B"
CmpCmn=/usr/bin/cmp
DiffCmn=/usr/bin/diff

for file1 in $DIR1/*; do #Get the files under DIR1 one by one
        filex=$(basename $file1) #Get only the name ofthe ile
        echo "searching for $filex"
         $DiffCmn $filex $DIR2  #Check whether the file is under DIR2 or not
        if [ $? -ne 0 ]
        then
                echo " No file with $filex name under $DIR2 folder"
        else
                echo " $filex exists under $DIR2" 
                $CmpCmn  $file1 $DIR2/$filex  #Compare if the files are exactly same
                if [ $? -ne 0 ]
                then
                         echo " $filex is not same"
                 else
                         echo " $filex is the same"
                 fi
fi
        done
0 голосов
/ 02 октября 2018

Этот код основан на коде в вопросе:

testdir='/home/oracle/ideatest/test/'
livedir='/home/oracle/ideatest/live/'

shopt -s nullglob   # Globs that match nothing expand to nothing
shopt -s dotglob    # Globs match files whose names start with '.'

for testpath in "$testdir"*
do
    [[ -f $testpath ]] || continue  # Skip non-files

    testfile=${testpath##*/}        # Get file (base) name
    printf '%s\n' "$testfile"
    livepath=${livedir}${testfile}  # Make path to (possible) file in livedir

    if [[ -f $livepath ]]
    then
        printf '%s\n' "$testfile"
        echo "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy"
    else
        echo "nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn"
    fi
done
0 голосов
/ 02 октября 2018

Вам нужно найти файлы, включенные comm в каталогах A и B.

comm -12 \
    <(cd A && find . -type f -maxdepth 1 | sort) \
    <(cd B && find . -type f -maxdepth 1 | sort)

Live версия доступна на tutorialspoint .

  1. Как это работает?список поиска содержит файлы в каталогах A и B, а comm отображает только файлы / строки, общие для обоих входов.comm необходимо отсортировать входные данные, поэтому | sort
  2. Не анализировать ls выходные данные.ls для хорошего форматированного вывода.Используйте find . и проанализируйте его вывод.
...