2016-08-25 2 views
-1

У меня есть папка с файлами:Как переназначить uid/gid в tar-архиве?

UID  GID 
10000 10000 ./file1.txt 
10000 10000 ./file2.txt 
10400 10400 ./file3.txt 
10402 10402 ./file4.txt 
10052 10052 ./file5.txt 

Я хочу, чтобы создать архив tar.bz2 с рядом UID/GID:

UID  GID 
0 0 ./file1.txt 
0 0 ./file2.txt 
400 400 ./file3.txt 
402 402 ./file4.txt 
52 52 ./file5.txt 

Я хочу, чтобы вычесть 10000 из всех UID и GID и сохранить результат как tar.bz2.

Как я могу это сделать?

+0

Я исправил несколько ошибок в моем (ранее непроверенном) ответе. Теперь он проверен и проверен на работу. –

ответ

1

Предположительно вы знаете, что вам нужно root привилегия для изменения UID/GID. Будет работать следующий скрипт. Его можно было бы улучшить, приняв аргументы командной строки, чтобы указать каталог ввода и выходное имя файла .tar.bz2.

#!/bin/bash 

for file in `find . -type f -print` 
do 
    UID=`ls -lnd "$file" | awk '{print $3}'` 
    GID=`ls -lnd "$file" | awk '{print $4}'` 
    NEWUID=`expr $UID - 10000` 
    NEWGID=`expr $GID - 10000` 
    if [ "$NEWUID" -ge 0 -a "$NEWGID" -ge 0 ]; then 
     echo chown ${NEWUID}:${NEWGID} "$file" 
     chown ${NEWUID}:${NEWGID} "$file" 
    fi 
done 
tar cvjSf /tmp/remap.tar.bz2 . 
+0

Что происходит с файлами с пробелами в их именах? (Я согласен, это глупо!). По крайней мере dbl-quote ссылается на '' $ file''. Кроме того, избавьтесь от своих 30-летних csh и получите «современную» (post 1988) cmd-substitution в 'bash', используя' UID = $ (ls -lnd "$ file" | awk '{print $ 3}') '; -) Всем удачи. – shellter

+0

@shellter Но мне нравятся усталые старые привычки! Честно говоря, замена старой команды обратной котировки больше связана с опытом/bin/sh, чем с чем-либо еще. Я исправлю цитату, спасибо, указав ее. –

Смежные вопросы