cp some/path/**/*.h は、すべての深さから .h ファイルを除外します。

cp some/path/**/*.h は、すべての深さから .h ファイルを除外します。

[コピー]コマンドを使用して、ディレクトリとすべてのサブディレクトリのすべての.hファイルを別のフォルダにコピーしようとします。

cp --parents -r tensorflow/lite/**/*.h libtensorflowlite-2.13.0-linux/include

上の glob は .h ファイルのみをコピーし、さらにtensorflow/lite/XXX/*.h下 (たとえばtensorflow/lite/XXX/XXX.h) またはtensorflow/lite/*.hルートディレクトリ ( ) にある .h ファイルは含みません。この問題を解決するには、cp予想されるすべての再帰レベルに対して複数のコマンドを実行する必要があります。

cp --parents -r tensorflow/lite/*.h libtensorflowlite-2.13.0-linux/include
cp --parents -r tensorflow/lite/**/*.h libtensorflowlite-2.13.0-linux/include
cp --parents -r tensorflow/lite/**/**/*.h libtensorflowlite-2.13.0-linux/include
cp --parents -r tensorflow/lite/**/**/**/*.h libtensorflowlite-2.13.0-linux/include

私はここで明らかなものを見逃していることを知っています。 「.hで終わるすべてのサブディレクトリのすべてのファイル」を繰り返し表すglobを作成するより簡単な方法はありますか?

答え1

**/1992 zsh シェルのすべてのサブディレクトリレベルと一致します。

ksh93は2003年にそれを複製しましたが、以前のバージョンとの互換性のためにデフォルトで無効にし(以前**と同じ*set -G/ enabledを渡しましたset -o globstarbashは2009年にこの機能を追加した最後のシェルの1つでしたが、ksh93と同じように実装されました(5.0以前は偽物でしたが)shopt -s globstar

だから:

cp --parents tensorflow/lite/**/*.h libtensorflowlite-2.13.0-linux/include

これはzshで動作します(またはzshとは少し異なりますが、デフォルトfishではある程度有効になっています)、最初に他のシェルでオプションまたは対応するオプションを有効にする必要が**あります。globstar

set   -o globstar      # ksh93
set   -o extended-glob # yash
set      globstar      # tcsh
shopt -s globstar      # bash

詳細については、次を参照してください。ls *、ls**、およびls***の結果

答え2

.hこのコマンドは、そのサブディレクトリ内のすべてのファイルを見つけ、そのファイルtensorflow/liteとその相対パスをターゲットディレクトリにコピーしますlibtensorflowlite-2.13.0-linux/include

find tensorflow/lite -type f -name "*.h" -exec cp --parents {} libtensorflowlite-2.13.0-linux/include/ \;

find tensorflow/lite

  • ディレクトリから検索を開始しますtensorflow/lite

-type f

  • ディレクトリ以外のファイルのみを検索するように find に指示します。

-name "*.h"

  • 拡張子が.hのファイルのみを考慮するように指定します。

-exec cp --parents {} libtensorflowlite-2.13.0-linux/include \;

  • -execcp見つかったすべてのファイルに対して実行します。

{}.hは、見つかった各ファイルのパスに置き換えられ、--parentsファイルの親ディレクトリがlibtensorflowlite-2.13.0-linux/include存在しない場合はターゲットディレクトリに作成されていることを確認します。

関連情報