web-dev-qa-db-ja.com

元のファイル拡張子を削除した `find`を含む` tar`

このようなテキストファイルの束から_tb2_ファイルを作成したいと思います。 tar cfj $(basename ./2014_04_09.txt .txt).tb2 $(basename ./2014_04_09.txt)

このコマンドを使用すると、ディレクトリを含まないアーカイブファイル_2014_04_09.tb2_を作成できます。

しかし、このようにfindの_-exec_オプションを指定してコマンドを適用すると、

find . -name "*.txt" -exec tar cfj $(basename "{}" .txt).tb2 $(basename "{}") \;

このコマンドは、元の拡張子(_2014_04_09.txt.tb2_)とアーカイブ内のディレクトリを持つアーカイブファイルを作成します。

単一のファイルのみを適用する場合のように、tarコマンドをfindとともに使用するにはどうすればよいですか。

1
ironsand

代わりに、シェルコマンドを-execする必要があります。

find . -name "*.txt" -exec sh -c 'tar cfj $(basename "{}" .txt).tb2 "{}"' -- {} \;

さらに、findコマンドはfindingすべてのレベルのファイルであることに注意してください。そのため、ファイルが現在のディレクトリに存在しない場合、basenameを使用してファイルのリストを渡すことは機能しません。

詳述すると、

tar cfj foo.tb2 foo.txt

foo.txtが現在のディレクトリに存在しない場合、エラーが発生します。そのため、パスをfoo.txtに渡す必要があります。

2
devnull