Unix tar, не изменяющий каталог

Так, принятие Вас хочет позволить пользователям www-data и netbeans к доступу /var/www/project путем добавления их обоих к группе netbeans:

# you might have done this already, but no harm will be done by
# executing these commands again:
groupadd netbeans
adduser www-data netbeans
adduser netbeans

# set the user 'www-data' and the group 'netbeans' as the owners
chown www-data:netbeans -R /var/www/project
# allow group members to read and write files
chmod g+rw -R /var/www/project
3
29.04.2015, 00:44
3 ответа

Это легко динамически построить последовательность и оценить его:

eval "$(echo -n 'pr -mt '; while read ext; do echo "<(ls -1 *.$ext)"; done < list  |tr '\n' ' ' )"

где list будет файл (возможно, fifo), представляющий список расширений, из которых вы хотите построить команду.

< () по существу создает неназванные FIFO. Альтернативой без оценки может быть использование именованных файлов:

while read ext; do mkfifo ${ext}.pipe; ls -1 *.$ext > ${ext}.pipe & done
pr -mt *.pipe
rm *.pipe  #remove the named pipes when done

Выше предполагается, что в каталоге отсутствуют другие имена файлов, оканчивающиеся на «.pipe».

-121--139523-

Вероятно, полученное сообщение об ошибке указывает на то, что ни один файл не соответствует имени образца .swp $ . Как правило, более безопасный способ сделать то, что вы написали (потому что он будет обрабатывать любое имя файла):

find . -name '*.swp' -print0 | xargs -0 rm -i --

В фрагменте выше я использовал -print0 , чтобы найти отделяет записи с нулевыми символами; значение по умолчанию - newlines, что к сожалению, он допустим в пределах имени файла. Команда -print0 работает с любыми именами файлов, включая те, которые встраивают новые строки. Аналогично, xargs -0 обрабатывает свои входные данные как разделенные нулями записей.

-121--117356-

* расширяется оболочкой перед выполнением tar . Таким образом, изменение tar в каталоге делает недействительными аргументы, которые * расширены в. Вы можете просто сказать tar , чтобы сжать каталог:

tar -czf /backupmnt/abc.tar.gz -C /backupmnt/statusService/ .

. представляет текущий каталог, который изменяется при изменении tar каталогов. Это приведет к появлению скрытых файлов (начиная с . ), включенной в архив.

7
27.01.2020, 21:10

-C все равно не является переносной опцией. Это вариант GNU, а не UNIX.

tar в любом случае больше не указана в Единой Спецификации UNIX, так как между реализациями есть большая разница. Она имеет pax для создания архивов portable.

Можно сделать:

pax -ws '|.*//||' /backupmnt/statusService//. /some/other/dir//./*.ext |
  xz > file.tar.xz

(xz/gzip не указан POSIX).

Это использование //. для обозначения того, какая часть путей должна быть удалена.

0
27.01.2020, 21:10

Почему не использовать явное изменение каталога?

cd /backupmnt/statusService && tar -czf /backupmnt/abc.tar.gz *

Или вы можете использовать относительные пути:

cd /
tar -czf /backupmnt/abc.tar.gz backupmnt/statusService1/* backupmnt/statusService2/* backupmnt/statusService3/*

Что может быть даже лучшим решением, поскольку вы будете хранить файлы разделены по папкам и избегают перезаписи повторяющихся имен файлов

2
27.01.2020, 21:10

Теги

Похожие вопросы