
[コピー]コマンドを使用して、ディレクトリとすべてのサブディレクトリのすべての.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 globstar
。bash
は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 \;
-exec
cp
見つかったすべてのファイルに対して実行します。
{}
.h
は、見つかった各ファイルのパスに置き換えられ、--parents
ファイルの親ディレクトリがlibtensorflowlite-2.13.0-linux/include
存在しない場合はターゲットディレクトリに作成されていることを確認します。