我有兩個目錄,我需要以這種格式輸出它們的差異
例 :
DIR1 conatins : file1
file2
file3
DIR2 contains : file1
file4
輸出(僅檔案名,無檔案內容):file1 被修改或相同,file2 被刪除,file4 被加入
答案1
這很簡單,看看流行的工具diff
:
diff -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
陣列來保存每個目錄中找到的名稱,然後進行迭代,直到其中一個陣列為空。
在循環中,我將每個陣列的名字相互比較。如果名稱相同,則檔案相同或可能已修改(然後從兩個陣列中刪除該名稱)。
如果第一個陣列中的名稱排在第二個陣列中的名稱之前(使用 測試<
),則第二個目錄中缺少第一個名稱。現在刪除第一個陣列的第一個元素。
否則,第一個目錄中將缺少第二個陣列中的名稱。現在刪除第二個陣列的第一個元素。
循環結束後,其中一個陣列可能仍然非空,因此如果需要,請輸出該陣列中的名稱。