【问题标题】:FreeBSD Bash awk $11 to end of line adding \ before spaces?FreeBSD Bash awk $11 到行尾在空格前添加 \?
【发布时间】:2014-02-14 13:50:10
【问题描述】:

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

我正在编写一个用于 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

这是一个输出文件的例子

 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 文件格式,但我我无法弄清楚该怎么做。

任何帮助都会很棒!

【问题讨论】:

  • 试试cut -d" " --complement -f1 代替awk 或者你可以使用awk '{$11=""; sub(/^ */, "");}1'
  • 它输出 ./Backup.sh: line 43: syntax error near unexpected token |' ./Backup.sh: line 43: for f in cat output_file|awk '{$11=""; sub(/^ */, "");}1' ; do chown cat output_file|grep $f\$|awk '{print $5 ":" $6}'` $f ;完成'
  • 没有错误可以显示脚本?
  • for f in cat output_file|awk '{$11=""; sub(/^ */, "");}1' ; do chown cat output_file|grep $f\$|awk '{print $5 ":" $6}'` $f ;完成
  • 请将代码粘贴到您的问题窗口中,使其格式正确。

标签: bash awk rsync freebsd chown


【解决方案1】:

你工作太辛苦了,也让电脑工作太辛苦了。 从不管道 cat 到 grep 到 awk。在这种情况下,您不需要任何这些工具。做吧:

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

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

【讨论】:

  • 是的!太棒了!我只是想用我知道的工具来做。不是我需要,而是试图了解您的解决方案以供将来参考,这可以用来恢复权限吗? chmod $perm $path ?
  • 你从文件中读取了变量的值;一旦你定义了变量,你就可以对它们做任何你想做的事情。
【解决方案2】:

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

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

【讨论】:

  • 输出变为:chown: 12 22:36 /mnt/Tank2/Users/root/week 1: No such file or directory
  • 请先手动运行 awk 命令,可能需要调整 substr() 中的数字,在我的系统中是 78,但从您的 output_file 中是 112。您需要自己确认。
  • 在 awk 命令中更改 110 会更改空格的数量,但它始终会在空格之后显示数据。我用最终的脚本尝试了几个不同的数字,并且没有产生与我每次发布的相同的输出
  • 我明白了。错误出现在 5 美元和 6 美元上,似乎它们不是所有者和组。 (12 22:36,日期和时间??),你也可以调整一下吗?
猜你喜欢
  • 2021-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-17
  • 1970-01-01
  • 1970-01-01
  • 2018-07-05
  • 1970-01-01
相关资源
最近更新 更多