FreeBSD Bash awk $ 11 до конца строки с добавлением \ перед пробелами?

Я бился головой о стену, пытаясь заставить это работать.

Я пишу сценарий резервного копирования rsync для использования на freebsd. У меня нет привилегий 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, но я не могу понять, как это сделать.

любая помощь будет здорово!


person JJD    schedule 13.02.2014    source источник
comment
Попробуйте cut -d" " --complement -f1 вместо awk или вы можете использовать awk '{$11=""; sub(/^ */, "");}1'   -  person Jayesh Bhoi    schedule 13.02.2014
comment
он выводит ./Backup.sh: строка 43: синтаксическая ошибка рядом с неожиданным токеном |' ./Backup.sh: line 43: for f в cat output_file|awk '{$11=""; sub(/^ */, "");}1' ; do chown cat output_file|grep $f\$|awk '{print $5 : $6}'` $f ; сделано'   -  person JJD    schedule 13.02.2014
comment
нет ошибки для меня может показать скрипт?   -  person Jayesh Bhoi    schedule 13.02.2014
comment
for f in cat output_file|awk '{$11=""; sub(/^ */, "");}1' ; do chown cat output_file|grep $f\$|awk '{print $5 : $6}'` $f ; сделано   -  person JJD    schedule 13.02.2014
comment
вставьте код в окно вопроса, чтобы он выглядел в правильном формате.   -  person Jayesh Bhoi    schedule 13.02.2014


Ответы (2)


Вы слишком много работаете и заставляете компьютер работать слишком много. Никогда направлять 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 поместит все конечные поля в путь, сохраняя пробелы.

person William Pursell    schedule 14.02.2014
comment
ДА! это восхитительно! Я просто пытался сделать это с помощью инструментов, которые я знаю. не то чтобы мне это нужно, но пытаюсь понять ваше решение для дальнейшего использования, можно ли это использовать для восстановления разрешений? chmod $ perm $ путь? - person JJD; 15.02.2014
comment
Вы читаете значение переменных из файла; как только вы определили переменные, вы можете делать с ними все, что хотите. - person William Pursell; 15.02.2014

Во-первых, проверьте, в порядке ли вывод или нет.

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
person BMW    schedule 13.02.2014
comment
вывод становится следующим: chown: 12 22:36 /mnt/Tank2/Users/root/week 1: Нет такого файла или каталога - person JJD; 13.02.2014
comment
Пожалуйста, сначала запустите команду awk вручную, вам может потребоваться изменить число в substr() , в моей системе это 78, но из вашего output_file это 112. Вам нужно подтвердить это самостоятельно. - person BMW; 13.02.2014
comment
изменение 110 в команде awk изменяет количество пробелов, но всегда отображает данные после пробелов. я пробовал несколько разных номеров с окончательным скриптом и не делал различий в том же выводе, что и каждый раз - person JJD; 13.02.2014
comment
Я понимаю. Ошибка на $5 и $6, кажется, они не являются владельцем и группой. (12 22:36, дата и время??), можно и его настроить? - person BMW; 13.02.2014