使用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中创建了新文件,这可能是可以接受的。