ファイルのリストを含むテキストファイルがあります。
私は使用します。
tar --null --no-recursion -uf abc.tar --directory= /tmp/temp --files-from abc.txt
このコマンドは、単にテキストファイルにリストされているすべてのファイルを含むtarを生成します。
リストから選択した数のファイルのみを圧縮する方法はありますか?たとえば、テキストファイルにリストされている最初の50ファイルのみが説明されます。
答え1
次のように試すことができます:(ファイル名にスペースを許可するように更新されました。)
head -50 abc.txt | tr "\n" "\0" | xargs -0 tar --null -no-recursion -uf abc.tar --directory=/tmp/temp
このコマンドはhead -50
リストファイルの最初の50行を取得します。結果|
はにパイプされますtr
。デフォルトでは、改行文字をnull文字に置き換えるtr
変換操作が行われます。結果はにパイプされ、その行をすべてコマンドの引数に変換します。引数は、空白ではなくNULL文字に基づいて別々の引数を作成します。これにより、ファイル名にスペースが含まれていてもコマンドが機能します。\n
\0
xargs -0
tar
-0
xargs
コメントをお寄せいただいたJordanに感謝します。
答え2
head
またはを使用して、限られtail
た数のファイルを制御できますabc.txt
。
はい
サンプルabc.txt
ファイル。
$ cat abc.txt
afile1
afile10
afile2
afile3
afile4
afile5
afile6
afile7
afile8
afile9
次の場所に最初の3つのファイルのみをパッケージ化しますabc.txt
。
$ head -3 abc.txt | tr '\n' '\0' | tar --null --no-recursion -uf abc.tar -T -
上記の出力は、head ...
行末文字(\n
)をNULL文字(\0
)に変換します。その後、この出力は-T -
STDIN()を介して出力を受け取るtarにパイプされます。最後のビットはtar
STDINを入力として使用するように指示しますtar
。
確認するabc.tar
:
$ tar tvf abc.tar
-rw-rw-r-- saml/saml 0 2013-08-05 13:24 afile1
-rw-rw-r-- saml/saml 0 2013-08-05 13:24 afile10
-rw-rw-r-- saml/saml 0 2013-08-05 13:24 afile2
上記の内容をhead -3 ...
head -100 ... for example, to get the 1st 100. Or you could use
tail -100 ... `から変更して、ファイルの最後の100を取得できます。
答え3
Bichoyの答えに対するjordanmのコメントに触発され、空白のあるファイル名を処理する方法は次のとおりです。
count=50
i=1
while [ $i -le $count ]
do
read filename
tar --null -no-recursion -ruf abc.tar "$filename" --directory=/tmp/temp
i=$(($i+1))
done <abc.txt
私はあなたが望む行数をソフトコーディングできるようにwhile
doの代わりにループを使います。for i in {1..50}
答え4
ファイル名に改行がないと確信している場合は、nullバイトを改行に変換してhead
最初の数行を保持するように呼び出します。
<abc.txt tr '\0' '\n' |
head -n 50 |
tar --null --no-recursion -uf abc.tar --directory= /tmp/temp --files-from -
改行文字を含むファイル名を処理するには、改行文字とnullを変換してからhead
内容をそのままにして再変換します。
<abc.txt tr '\0\n' '\n\0' |
head -n 50 |
tr '\0\n' '\n\0' |
tar --null --no-recursion -uf abc.tar --directory= /tmp/temp --files-from -