[英]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
將不會遞歸搜索。
現在,讓我們比較文件目錄A
和B
:
diff <(getfiles A) <(getfiles B)
輸出采用通常的diff
格式。 由於可以使用diff的任何常規選項,因此輸出格式非常靈活。
這是示例目錄A
和B
,每個目錄都有一個文件,而另一個則沒有。
$ 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.