簡體   English   中英

在Linux中,如何僅按文件名比較兩個目錄並獲取不匹配的結果列表

[英]In linux, how to compare two directories by filename only and get list of results that did not match

我想知道如何僅通過文件名(忽略擴展名)比較兩個目錄(而不是遞歸)以得到差異。 例如,如果我有列表A和B,我想知道A中而不是B中有什么。

我目前正在處理一些圖像。 在一個目錄中,我具有擴展名為.tiff的源文件,在另一個目錄中,我已經處理了具有擴展名.png的文件。 兩個目錄中的文件名相同,但只有擴展名不同(例如,一個文件在目錄A中命名為foo.tiff,在目錄B中命名為foo.png)。

我正在嘗試查找尚未處理的文件。

謝謝!

首先讓我們創建一個輔助函數:

getfiles() { find "$1" -maxdepth 1 -type f -exec bash -c 'for f in "$@"; do basename "${f%.*}"; done' "" {} + | sort; }

如果運行getfiles dirname ,它將返回該目錄中文件的排序列表,而不包含目錄名稱和任何擴展名。 -maxdepth 1選項表示find將不會遞歸搜索。

現在,讓我們比較文件目錄AB

diff <(getfiles A) <(getfiles B)

輸出采用通常的diff格式。 由於可以使用diff的任何常規選項,因此輸出格式非常靈活。

這是示例目錄AB ,每個目錄都有一個文件,而另一個則沒有。

$ ls */
A/:
bar.png  foo.png  qux.png

B/:
bar.tiff  baz.tiff  foo.tiff

輸出:

$ diff <(getfiles A) <(getfiles B)
1a2
> baz
3d3
< qux

輸出正確地標識(a) B具有A不存在的baz文件,以及(b) A具有B不存在的qux文件。

替代產出

假設我們只是想進行單方面的比較,然后找出B中的哪些文件不在A 在這種情況下,可以使用grep

$ grep -vxFf <(getfiles A) <(getfiles B)
baz

這里使用的選項是:

  • -v告訴grep排除匹配的行

  • -x告訴grep只匹配整行

  • -F告訴grep模式是固定的字符串,而不是正則表達式。

  • -f告訴grep從文件或在這種情況下的類似文件的對象<(getfiles A)獲取模式列表。

文件和目錄名稱包含空格的示例

考慮以下文件:

$ ls */
A A/:
1 bar.png  1 foo.png  1 qux.png

B B/:
1 bar.tiff  1 baz.tiff  1 foo.tiff

輸出:

$ diff <(getfiles 'A A') <(getfiles 'B B')
1a2
> 1 baz
3d3
< 1 qux

要么,

$ grep -vxFf <(getfiles 'A A') <(getfiles 'B B')
1 baz

局限性

如果您的任何文件名中都包含換行符,這將導致錯誤的結果。 至少對於grep形式,這可以擴展到更一般的情況。

希望這可以幫助。

-q僅報告文件是否不同,而不報告差異的詳細信息。
-r比較目錄時,遞歸比較找到的所有子目錄。

diff -qr /dir1 /dir2

使用diff命令可以為您完成此操作。

diff DirA/ DirB/

如果我理解你正確你的腳本:

#/bin/bash
SAVEIFS=$IFS
IFS=$(echo -en "\n\b")
folder1="/home/vagrant/1 b"
folder2="/home/vagrant/2 a"
ext1="tiff"
ext2="png"


for fullfile in ${folder1}/*.$ext1
do
        #echo "$fullfile fullfile"
        filename=$(basename "$fullfile")
        #echo "$filename file"
        extension="${filename##*.}"
        #echo "$extension ext"
        cleanfilename="${filename%.*}"
        #echo "$cleanfilename base"
        if ! [ -a "${folder2}/$cleanfilename.$ext2" ]
        then
                echo $fullfile
        fi
done
IFS=$SAVEIFS

它顯示第一個文件夾中存在但第二個文件夾不存在的文件。 像這樣:

admin$ mkdir 1
admin$ mkdir 2
admin$ touch 1/1.tiff
admin$ touch 1/2.tiff
admin$ touch 1/3.tiff
admin$ touch 2/1.png
admin$ touch 2/2.png
admin$ vim diff.sh
admin$ chmod +x diff.sh 
admin$ ./diff.sh 
/Users/admin/1/3.tiff

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM