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***の結果

おすすめ記事