当将本地文件和远程文件进行比较时,处理文件名和路径中的空格(如果相同,则删除远程文件)



目标目录应该是变量,但这在以后很容易修复。目标目录是本地目录(从中运行命令(和远程目录("/home/user/somepath/"(。比较目标目录和子目录中的所有文件,并在匹配时删除远程文件。如果它确实查看了目标目录中的文件本身,则不起诉,但这可以稍后处理。理想情况下,这将比较1层以上的深度,但如果需要,可以从子目录中递归调用。或者也许我处理这件事的方式都错了,如果是这样,请告诉我另一种方式。

问题在于空间。替换"带有"\"导致找不到文件。如果路径或文件名有一个空格,下面的方法会起作用,但如果它们都有空格,bash会将其分解为多个参数。

echo;
for d in */; do
for fn in "$d"/*; do
if [ $(sha512sum "$fn" | cut -d ' ' -f 1) == $(ssh user@host sha512sum "/home/user/somepath/$fn" | cut -d ' ' -f 1) ];
then echo deleting "$fn"; ssh user@host rm "/home/user/somepath/$fn"; echo gone;
else echo diff;
fi;
done;
echo;
done

同样的空间问题,但这一次在本地哈希之前检查远程上是否存在文件以加快速度。通过这种方式,我应该能够更容易地将local1与remote1和remote2进行比较(就像您将remote1和remote2的内容复制到local1中一样(。

echo;
for d in */; do
for fn in "$d"/*; do
if [[ $(ssh user@host test "/home/user/somepath/$fn") ]];
then if [ $(sha512sum "$fn" | cut -d ' ' -f 1) == $(ssh user@host sha512sum "/home/user/somepath/$fn" | cut -d ' ' -f 1) ];
then echo deleting "$fn"; ssh user@host rm "/home/user/somepath/$fn"; echo gone;
else echo diff;
fi;
else echo remote dont got $fn;
fi;
done; echo;
done

不确定这是否重要,但假设targetdir中的dir是exdir1,filename是exfile.ext,它会打印出";exdir1//exfile.ext";当它回响$fn时。它和//一起工作,但可能对空间问题有一些影响。

对于ssh命令,请将"/home/user/somepath/$fn"更改为" '/home/user/somepath/$fn' ""'之间的间隔是可选的,这只是为了提高可读性。

你可以试着这样玩:

ssh user@host touch " '/tmp/foo    bar' "
ssh user@host ls    " '/tmp/foo    bar' "
ssh user@host rm    " '/tmp/foo    bar' "

最新更新