Есть ли способ разархивировать архив, не уничтожая владельца?

Для импорта в Excel простой запятой -, разделенной csv, вы можете использовать что-то вроде

sed -n '/Name = /!d
  N;N;N;N
  y/\n/,/
  s/, *Shareable = [^,]*//
  s/[^,=]*= //g;p' yourfile

Первая строка удаляет все строки, кроме Name =. Продолжайте только для них и добавьте четыре следующие строки в буфер с помощью N. Команда yзаменяет символы новой строки между строками запятыми-разделителями. Первая команда sудаляет строку Shareable, а вторая удаляет часть до =, оставляя только значение. Это будет работать для любого количества строк. В этом случае текстовые поля будут определяться автоматически без кавычек.

0
21.08.2019, 17:53
2 ответа

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

su -c "unzip myRootFolder.zip" superman 

su позволяет вам выполнить команду от имени другого пользователя или временно стать этим пользователем в рамках текущего сеанса входа в систему. Беги

man su

для полного описания команды.

1
28.01.2020, 02:39

unzipне имеет функции делать именно то, что вы описываете.

Когда он спросил тебя

replace myRootFolder/file.TXT? [y]es, [n]o, [A]ll, [N]one, [r]ename:

и вы ответили y, «заменить» означало, что он удалил исходный файл перед извлечением новой копии. Исходный файл исчез, включая все его метаданные (владельца, разрешения, временные метки ).

Использование резервных файлов

Опцией, которая выполняет часть того, что вам нужно, является опция -B, позволяющая сохранять резервную копию всех перезаписанных файлов. После unzip -Bвы должны увидеть (в выводе ll/ ls), что наряду с файлом обновления есть исходный файл с ~в конце имени :

.
-rw-r--r-- 1 superman superman  5 21 août  10:18 file.TXT~
-rw-r--r-- 1 root     root      5 21 août  10:18 file.TXT

Оттуда,вам необходимо скопировать право собственности на каждый файл резервной копии в новый файл с помощью chown, а затем удалить файлы резервных копий.

Вы можете сделать это, например.find -exec:

find myRootFolder -name "*~" -exec bash -c 'bak="{}";
  new="${bak%\~}";
  chown --reference "$bak" "$new" ; rm "$bak"' \;

, но это вызовет проблемы, если у вас уже были имена файлов, заканчивающиеся на ~, до того, как были созданы какие-либо резервные копии.

Кроме того, вы можете просмотреть содержимое zip (с помощью команды zipinfo, входящей в состав Info -ZIP ), и для каждого проверить, существует ли резервная копия, прежде чем выполнять chown... rm.

zipinfo -1 myRootFolder.zip | grep -v '$/' | while read new ; do
  bak="${new}~"
  test -e "$bak" || continue
  chown --reference "$bak" "$new"
  rm "$bak"
done
0
28.01.2020, 02:39

Теги

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