Команда tar - пропуск символических ссылок

function ключевое слово было представлено в ksh. Традиционная Оболочка Bourne только имела foo () синтаксис и POSIX стандартизируют только foo () синтаксис.

В ATT ksh (но не pdksh), существует несколько различий между функциями, определяемыми function и функции, определяемые с синтаксисом Границы/POSIX. В функциях, определяемых function, typeset ключевое слово объявляет локальную переменную: после того как функция выходит, значение переменной сбрасывается, в какой это прежде вводило функцию. С классическим синтаксисом переменные имеют глобальную область видимости, используете ли Вы typeset или нет.

$ ksh -c 'a=global; f () { typeset a=local; }; f; echo $a'
local
$ ksh -c 'a=global; function f { typeset a=local; }; f; echo $a'
global

Другое различие в ksh - это функции, определяемые с function ключевое слово имеет их собственный контекст прерывания. Прерывания, определенные вне функции, проигнорированы при выполнении функции и фатальных ошибок в функциональном выходе только функция а не из целого сценария. Кроме того, $0 имя функции в функции, определяемой function но сценарий называет в функции, определяемой с ().

Pdksh не эмулирует ATT ksh. В pdksh, typeset создает локально ограниченные по объему переменные независимо от функции, и нет никаких локальных прерываний (хотя с помощью function действительно имеет некоторые незначительные значения — см. страницу справочника для деталей).

Bash и zsh, представленный function ключевое слово для совместимости с ksh. Однако в этих оболочках function foo { … } и foo () { … } строго идентичны, как удар и zsh расширение function foo () { … }. typeset ключевое слово всегда объявляет локальные переменные (кроме с -g конечно), и прерывания не локальны (можно получить локальные прерывания в zsh путем установки local_traps опция).

12
02.09.2015, 01:05
2 ответа

Вы можете сделать это, чтобы предоставить tar список всех файлов внутри protTests , кроме тех, которые являются символическими ссылками:

find protTests -maxdepth 1 -mindepth 1 -not -type l -print0 |
  tar --null --files-from - -cvf protTests.tar

Между прочим, ваша существующая команда:

tar -cvf protTests.tar protTests/*

не будет архивировать все файлы в protTests , он будет архивировать только те, чьи имена не начинаются с . (те, что не скрыты). Оператор * glob пропускает файлы, имена которых начинаются с . по дизайну. У команды также есть проблема, заключающаяся в том, что если protTests имеет много файлов (более многих тысяч), тогда protTests / * может расширяться до слишком большого количества аргументов, чтобы поместиться в командной строке.

У более простой команды, подобной этой, не будет ни одной из этих проблем:

tar -cvf protTests.tar protTests
10
27.01.2020, 19:56

Моя реализация tar - лучший метод

star -cv -f out.tar -find protTests ! -type l
-2
27.01.2020, 19:56

Теги

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