獲取兩個目錄之間的差異及其完整詳細信息

獲取兩個目錄之間的差異及其完整詳細信息

我有兩個目錄,我需要以這種格式輸出它們的差異

例 :

DIR1 conatins :   file1
                  file2
                  file3
DIR2 contains :   file1
                  file4

輸出(僅檔案名,無檔案內容):file1 被修改或相同,file2 被刪除,file4 被加入

答案1

這很簡單,看看流行的工具diffdiff -r dir1 dir2 編輯:我把OP的問題弄錯了,只獲取信息文件不同,而不是如何它們不同,您需要使用以下-q選項: diff -r -q dir1 dir2

答案2

comm模擬或等工具如何join比較兩組排序的輸入,使用bash

# Get lists of (base-)names from both directories.
files1=( dir1/* ); files1=( "${files1[@]##*/}" )
files2=( dir2/* ); files2=( "${files2[@]##*/}" )

# Loop over these sorted lists until one of them is empty.
while [[ ${#files1[@]} -gt 0 ]] && [[ ${#files2[@]} -gt 0 ]]; do
        name1=${files1[0]}
        name2=${files2[0]}

        if [[ $name1 == "$name2" ]]; then
                # Name exists in both directories.
                printf '%s is modified or same\n' "$name1"
                files1=( "${files1[@]:1}" )
                files2=( "${files2[@]:1}" )
        elif [[ $name1 < $name2 ]]; then
                # Name exists in only first directory.
                printf '%s is removed\n' "$name1"
                files1=( "${files1[@]:1}" )
        else
                # Name exists in only second directory.
                printf '%s is added\n' "$name2"
                files2=( "${files2[@]:1}" )
        fi
done

# Handle remaining names.
if [[ ${#files1[@]} -gt 0 ]]; then
        printf '%s is removed\n' "${files1[@]}"
fi
if [[ ${#files2[@]} -gt 0 ]]; then
        printf '%s is added\n' "${files2[@]}"
fi

我使用兩個bash陣列來保存每個目錄中找到的名稱,然後進行迭代,直到其中一個陣列為空。

在循環中,我將每個陣列的名字相互比較。如果名稱相同,則檔案相同或可能已修改(然後從兩個陣列中刪除該名稱)。

如果第一個陣列中的名稱排在第二個陣列中的名稱之前(使用 測試<),則第二個目錄中缺少第一個名稱。現在刪除第一個陣列的第一個元素。

否則,第一個目錄中將缺少第二個陣列中的名稱。現在刪除第二個陣列的第一個元素。

循環結束後,其中一個陣列可能仍然非空,因此如果需要,請輸出該陣列中的名稱。

相關內容