私は現在、短いfindコマンドを使用して "tex"で終わるファイルを複数のディレクトリ(およびサブディレクトリ)から検索し、それを単一の一貫したテキストに入れます。私が使用するコマンドは次のとおりです。
find . -name '*.tex' -exec cat {} \; > blub.txt
しかし、findコマンドは私が望む方法でフォルダを検索しません。たくさん飛びますが、「2011」フォルダを先にとる代わりに「2013」などで始めます。 2011年から始まり、その中のサブディレクトリが「01 - 1月」フォルダで始まり、次に「2月2日」フォルダで始まるように変更する方法はありますか?
答え1
ディレクトリ全体があまりにも多くない場合は、find
コマンドラインにすべてのパスを提供して、パスを順次巡回するように強制できます。
shopt -s globstar
find **/ -name '*.tex' -exec cat {} \; > blub.txt
(bash構文を使用して再帰globを有効にします**
)。グローバルは自然な並べ替え順に展開されるため、年が最初に並べ替えられ、次に各数字の前に付けられた月が各年内で並べ替えられます。末尾のスラッシュは、bashがファイルを見つけるためにディレクトリのみを返すように要求しますfind
。
または、サブディレクトリに年のリストがある場合はそれを繰り返すことができます。
for year in *
do
find "$year"/* -name '*.tex' -exec cat {} \;
done > blub.txt
これは、1年の12ヶ月を各サイクルに拡張し、再びfind
順次処理されるようにします。
答え2
次のように動作します。
find -type f -name \*.tex -print0 | sort -z | xargs -0 cat >> blub.txt
print0
のオプションは、find
文字を使用してNUL
見つかったオブジェクトを分離し、sort -z
それを語彙順に配置するために使用できます。次に、このソートされたリストをに入力しますxargs
。