使用Unix find(1),如何在一个树中找到比另一个树中的文件更新的文件?

使用Unix find(1),如何在一个树中找到比另一个树中的文件更新的文件?,unix,find,Unix,Find,假设我有两个目录结构: /var/www/site1.prod /var/www/site1.test 我想使用查看/var/www/site1.test中比/var/www/site1.prod中的对应文件更新的文件 我可以这样做吗?如果可以,怎么做?我想你不能单独用find,但你可以做类似的事情 $ cd /var/www/site1.test $ files=`find .` $ for $f in $files; do if [ $f -nt /var/www/site1.p

假设我有两个目录结构:

/var/www/site1.prod
/var/www/site1.test
我想使用查看
/var/www/site1.test
中比
/var/www/site1.prod
中的对应文件更新的文件


我可以这样做吗?如果可以,怎么做?

我想你不能单独用find,但你可以做类似的事情

$ cd /var/www/site1.test
$ files=`find .`
$ for $f in $files; do
     if [ $f -nt /var/www/site1.prod/$f ]; then echo "$f changed!"; fi;
  done

如果查看-fprintf选项,您应该能够创建两个查找,并将其输出到两个文件中,其中列出了文件名和修改时间。然后,您应该能够区分这两个文件以查看发生了什么变化。

您还可以使用rsync-n

rsync-av-n/var/www/site1.test/var/www/site1.prod


应该这样做。

使用查找

cd /var/www/site1.test
find . -type f -print | while read file ; do
  [ "$file" -nt /var/www/site1.prod/"$file" ] && echo "File '$file' changed"
done
这将适用于包含空格的文件名,也适用于大量文件。

根据Eddie的评论,为了区分修改过的文件和丢失的文件

cd /var/www/site1.test
find . -type f -print | while read file ; do
  [ "$file" -nt /var/www/site1.prod/"$file" ] && reason=changed
  [ \! -e /var/www/site1.prod/"$file" ] && reason=created
  [ -n "$reason" ] && echo "$file $reason"
done

我知道你特别要求更新,但我认为知道你所有的选择总是好的

我会使用diff-ur dir1 dir2


也许时间戳改变了,也许没有,但这并不一定能告诉你内容是否相同。Diff将告诉您内容是否更改。如果您确实不想查看内容,请使用diff-rq查看更改的文件。

retitle:“查找(1)个比其他文件更新的文件”,至少,请+1。虽然可能会关闭,因为这与系统管理比编程更相关。“我,我没有把它们分开得那么整齐”。@Adriano Varoli Piazza:我会把shell脚本算成编程:)我说过我不会关闭它。但就我在其他问题中所看到的而言……小的修改:对于$file中的f;如果[$f-nt/var/www/site1.prod/$f],则执行;然后回显“$f已更改”;fi;doneThis将为包含空格的文件名中断,并为某些(ba)上的大量文件中断shes.警告:这不会告诉您是否在/var/www/site1.prod中创建了新文件,而不是在/var/www/site1.test中创建了新文件,这可能是可以接受的。这不是我在上看到的第一个shell脚本,因此很容易忘记文件名可能包含空格。这是因为您使用的diff版本支持“-q”option.Warning:与您正在更正的解决方案一样,这不会告诉您是否在/var/www/site1.prod中创建了新文件,而不是在/var/www/site1.test中创建了新文件,这可能是可以接受的。