2016-08-25 37 views
-1

私は、ファイルとフォルダを持っている:私はすべてのuidとgidから10000を減算し、結果を保存したいuid/gidをtarアーカイブに再マッピングする方法は?

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

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

私は次のUID/GIDとtar.bz2アーカイブを作成するにtar.bz2として

どうすればいいですか?

+0

私は(以前にテストされていない)答えにいくつかの誤りを修正しました。今すぐテストされ、動作することが確認されています。 –

答えて

1

UID/GIDを変更するには、root特権が必要であることがわかっているでしょう。以下のスクリプトが動作します。入力ディレクトリと出力.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

名前にスペースが含まれているファイルはどうなりますか? (私は馬鹿だと同意する!)。少なくとも、 "$ file"にrefをdbl-quoteしてください。また、あなたの30年のcshを振り払い、 'UID = $(ls -lnd" $ file "| awk '{print $ 3}')'を使って 'bash'で' modern '(1988年以降)のcmd置換を楽しんでください。 -) 皆さんお元気で。 – shellter

+0

@shellterしかし、私は疲れた古い習慣が好きです!正直なところ、古い学校のバッククォートコマンドの置換は、/ bin/shの経験と他に何も関係ありません。私は引用問題を修正します、それを指摘していただきありがとうございます。 –

関連する問題