遍历一个目录并检查它是否存在于另一个目录中

时间:2018-10-02 07:24:50

标签: linux bash loops if-statement redhat

我在目录A中有一个包含20000个文件的文件夹,另一个是文件夹 在另一个目录B中有15000个文件,我可以遍历一个目录 使用:

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
  

我正在尝试解决多年来版本控制不良的结果   那种非常可爱的脚本,可以发送表格以实现生活环境,但是每个   编译并发送实时版本时的名称如下   (testform.fmx),但在测试目录中有大约10个名为like的文件   (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 :(得分:1)

您基本上可以使用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

答案 1 :(得分:1)

此代码基于问题中的代码:

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

答案 2 :(得分:0)

您需要在A和B目录中找到comm上的文件。

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

可通过tutorialspoint获得实时版本。

  1. 它是如何工作的?查找列表列出了A和B目录中的文件,comm仅显示两个输入中共有的文件/行。 comm需要对输入进行排序,这就是| sort
  2. 的原因
  3. 不解析ls输出。 ls适用于格式良好的输出。使用find .并解析其输出。