web-dev-qa-db-ja.com

名前に特殊文字が含まれるファイルでfindとtarを使用する

すべての.ctlファイルをフォルダーに再帰的にアーカイブしたいと思います。

tar -cf ctlfiles.tar `find /home/db -name "*.ctl" -print`

エラーメッセージ:

tar: Removing leading `/' from member names
tar: /home/db/dunn/j: Cannot stat: No such file or directory
tar: 74.ctl: Cannot stat: No such file or directory

私はこれらのファイルを持っています:/ home/db/dunn/j74.ctlとj75。余分なスペースに注意してください。ファイルに他の特殊文字が含まれている場合はどうなりますか?これらのファイルを再帰的にアーカイブするにはどうすればよいですか?

5
Costi

Tarの_-T_機能を使用して、別のファイルからファイルのリストを読み取るように指示します(tarは各行を個別のファイルとして扱います)。

次に、<()表記を使用して、コマンドの出力からシェルに疑似ファイルを生成させることができます。

_tar cf ctlfiles.tar -T <(find /home/db -name "*.ctl")
_

シェルが<()表記をサポートしていない場合は、一時ファイルを使用できます。

_find /home/db -name "*.ctl" > ctlfile-list
tar cf ctlfiles.tar -T ctlfile-list
rm ctlfile-list
_
5

次のように、findの-print0機能をxargsの-0機能と一緒に使用できます。

find /home/db -name '*.ctl' -print0 | xargs -0 tar -cf ctlfiles.tar

-print0(ハイフン-print-zero)は、スペースの代わりにパス間の区切り文字としてnullを使用するようにfindに指示し、ハイフンゼロ)はxargsに同じことを期待するように指示します。

---(追加するために編集:

多数のファイルがある場合、xargsはtarを複数回呼び出す可能性があります。これに対処する方法についてはコメントを参照するか、このようにfind invoke tarを直接作成します。これは、名前にスペースや改行が含まれている場合でも、任意の数のファイルで機能します。

rm -f ctlfiles.tar
find /home/db -name '*.ctl' -exec tar -rf ctlfiles.tar {} +
4
Rob Davis

「-T」に続く引数が「-」の場合、ファイルのリストはstdinから取得されます。最近のバージョンのtarは通常、「-null」オプションをサポートしています。これは、「-T」オプションで指定されたソースで指定されたファイルがnullで区切られていることを示します。

したがって、以下は任意の数のファイルで機能し、改行文字が含まれている可能性があります。

find /home/db -name '*.ctl' -print0 | tar --null -T - -cf ctlfiles.tar
2
David Bartlett