在一个目录而不是另一个目录中查找文件


12

是否有Linux / Unix工具可以在一个目录中找到所有文件,而在另一个目录中却找不到?基本上,我正在寻找对ls输出有效的diff。

简短而优美的脚本也值得赞赏。

Answers:


20

diff 已经这样做了:

diff dir1 dir2

输出示例:

Only in dir1: some_file.txt
Only in dir1: some_other_file.txt
Only in dir2: third_file.txt

5
很好 一个难题:d​​iff实际上正在两个文件中的每个文件上运行。是否有一个晦涩的选项可以仅针对文件名运行(我可能已经错过了)?否则,我建议diff dir1 dir2 | grep "Only"
Willi Ballenthin

哇,这为我节省了很多bash脚本编写的时间,谢谢
user5359531


4

就像人们在这里告诉您的那样,您可以在各种用法中使用DIFF。或者您只使用dirdiff它,这就是您要尝试的!:-)

但是,如果您想使某些目录保持同步,那么您真的应该看看rsync

问候


3

如果您也想在所有子目录中执行此操作,则一个好的方法是:

diff --brief -r dir1/ dir2/

我更喜欢使用简短的方法,但是如果需要,可以将其省略。


1

for i in $(ls -1 directory1); do if (test -f directory2/$i) then echo $i; fi; done


0

这有效..

ls -a1 /dir1 | sort > /tmp/1
ls -a1 /dir2 | sort > /tmp/2
diff /tmp/1 /tmp/2

0

未经测试:

find /dir/A -printf "%P" | while read f; do
  if [ ! -e "/dir/B/$f" ]; then
    echo $f
  fi
done

0

丹尼斯·威廉姆森(Dennis Williamson)的回答很好,但是我需要递归地做到这一点。GNU findutils 4.7.0不对输出进行排序,所以这是我使用的

diff <(cd $dir1; find | sort) <(cd $dir2; find | sort)

为了做到这一点,我使用了以下方法:

diff <(cd $dir1; find | sort) <(cd $dir2; find | sort) \
| grep '< ./' | sed "s,< ./,$dir1/,"

为了使其正常工作,$ dir1和$ dir2都不应包含结尾斜杠。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.