FreeBSD Bash awk $ 11到行尾添加\之前的空格?

时间:2014-02-13 06:13:01

标签: bash awk rsync freebsd chown

我一直在撞墙试图让它发挥作用。

我正在编写一个用于freebsd的rsync备份脚本。我在远程服务器上没有root权限,我需要在远程服务器上很好地mv和cp这些文件,所以一旦我恢复它们,我就失去了所有权。

我正在尝试创建一个权限文件来备份所有权限和所有权,以便在数据恢复完成后重新应用。

这是备用代码

find /dir -ls >> output_file

这是恢复代码

for f in `cat output_file|awk '{print $11}'` ; do chown `cat output_file|grep $f\$|awk '{print $5 ":" $6}'` $f ; done

这是output_file的一个例子

 23319     3857 -rwxrwxrwx    1 root                         root                          1867545 Jan  9 22:55 /mnt/Tank2/Users/root/stampede/Little_House.jpg
 23320     3089 -rwxrwxrwx    1 root                         root                          1530449 Jan  9 22:57 /mnt/Tank2/Users/root/stampede/Milky_Way.jpg
 23325     3857 -rwxrwxrwx    1 root                         root                          1938544 Jan  9 22:47 /mnt/Tank2/Users/root/stampede/Shy_Horses.jpg
 23324     3857 -rwxrwxrwx    1 root                         root                          1940621 Jan  9 22:50 /mnt/Tank2/Users/root/stampede/Reinforcements.jpg

除非文件或文件夹名称中有空格,否则一切都很有效,然后失败。 如果我的文件夹被称为“文件夹1”,则脚本只会获得“文件夹” 我认为我需要做的就是将“cat output_file | awk'{print $ 11}'”从$ 11延伸到行尾,并在每个空格之前添加\所以输出符合标准* nux文件格式但是我我无法弄明白该怎么做。

任何帮助都会很棒!

2 个答案:

答案 0 :(得分:1)

你的工作方式太难了,也让计算机也很难用。 永远不会管道cat to grep to awk。在这种情况下,您不需要任何这些工具;只是做:

while read inode blocks perm links owner group bytes month day time path; do 
    chown $owner:$group "$path"
done < output_file

read会将所有尾随字段放入路径,保留空格。

答案 1 :(得分:0)

首先,检查输出是否正常。

awk '{print $5 ":" $6,substr($0,112)}' output_file

如果正常,请尝试以下脚本

awk '{print $5 ":" $6,substr($0,112)}' output_file |while read perm file
do
  chown "$perm" "$file"
done