ディレクトリ階層にファイルを一覧表示する必要があります。そのために、私は次のスクリプトを書いた。
foreach file ( * )
ls ${file}/*/*/*/*/*.root > ${file}.txt
end
しかし、これを行うには、$ {file}ディレクトリに4つのディレクトリがあることに注意する必要があります。それでは、どのように多くのサブディレクトリが存在するかを知る必要がないように、このスクリプトを一般化する方法はありますか?
答え1
csh
これで、ほぼすべての結果が実際にtcsh
tsh 6.18.00(20120114)以上を使用している場合に使用できます**
(OK tcsh --version
)。
ls "${file}"/**/*.root
これはただglobstar
変数が設定されている場合に機能します。
set globstar
以下の文書全体tcsh(1)
:
シェル変数は、すべての文字列(含む)に一致するファイルグローバルパターンを
globstar
許可するか、**
既存のサブディレクトリを再帰的に巡回するように設定できます。たとえば、現在のディレクトリツリー内のすべての.cファイルが一覧表示されます。単独で使用すると、ゼロ個以上のサブディレクトリと一致します(たとえば、/usr/includeディレクトリツリーに名前が付けられたすべてのファイルを一覧表示し、/usr/includeディレクトリツリーで終わるすべてのファイルと一致し、すべての.hと一致します)。サブディレクトリ名またはファイル名自体のファイル)。再帰の問題を防ぐために、globパターンはディレクトリを含むシンボリックリンクには降りません。この設定を上書きするには(+)を使用してください。***
/
ls **.c
ls /usr/include/**/time.h
time.h
ls /usr/include/**time.h
time.h
ls /usr/include/**time**.h
time
**
***
答え2
使用find
注文する。
foreach file ( * )
find ${file} -name "*.root" > ${file}.txt
end
約20年が経過したcsh以外のシェルを使用することを検討してください。 zshまたはbashを使用して対話的にスクリプトにcshを使用しないでください。