何千もの.txtファイルが互いにリンクされていますが、必要に応じてディレクトリに戻ってファイルを表示できるように、各.txtファイルのテキストの上にパスを作成したいと思います。
例:
file1.txtの内容は次のとおりです。
id: 1234
info: 1234
id: abcd
info: abcd
file1.txt のパスは pathto/dir1/sub1/file1.txt です。
file2.txtの内容は次のとおりです。
id: 5678
info: 5678
file2.txt のパスは pathto/dir2/sub2/file2.txt です。
リンクされた .txt ファイルの形式は次のとおりです。
pathto/dir1/sub1/file1.txt
id: 1234
info: 1234
id: abcd
info: abcd
pathto/dir2/sub2/file2.txt
id: 5678
info: 5678
個別にリンクすると、リンクされた各 .txt ファイル間のパスは印刷されません。これが私が望むものです。
また、 ~/ を CDpathto/
し、そこから "file.txt" ファイルのすべてのサブディレクトリを再帰的に検索するコマンドを実行する必要があります。
答え1
シェルがデフォルトで動作するように聞こえます。
#!/bin/bash
shopt -s globstar nocaseglob nullglob
for file in **/file.txt **/files.txt; do
printf '---------------------\n' >> allfiles.txt
printf '%s' "${file}" >> allfiles.txt
printf '---------------------\n' >> allfiles.txt
cat "${file}" >> allfiles.txt
done
答え2
ディレクトリレベルまで繰り返し、各サブディレクトリグループを繰り返し、ファイルを繰り返します。このような
for topdir in */
do
top=${topdir%/}
top=${top##*/}
for subdir in "$topdir"/*/
do
sub=${subdir%/}
sub=${sub##*/}
printf -- '-%s\n--%s\n\n' "$top" "$sub"
for file in "$subdir"/*
do
[ -f "$file" ] && cat <"$file"
done
done
done >output_file
ファイルをリンクしようとしただけであることを確認するために、ファイル間で明示的なループを使用しました。各サブディレクトリにファイルのみがあると確信している場合は、それを省略できます。
修正された質問に答えるためにはるかに短い解決策を提供できます。これは現在のディレクトリから呼び出されたファイルを検索し、file.txt
そのファイルをそのパス名に関連付けますoutput_file
。
find . -type f -name 'file.txt' -exec sh -c 'for f in "$@"; do printf "%s\n\n" "${f#./}"; cat "$f"; echo; done' _ {} + >output_file
答え3
あなたの質問とコメントによると、そのフォルダに移動して次のことを行っているようです。
cat filename* > concatenatedfile.txt
基本的にすべてがfilename
。
pwd
まず、コマンドを使用して実行してcat
ファイルの先頭にパスを置き、ファイルに接続を追加できます。
pwd > concatenatedfile.txt
cat filename* >> concatenatedfile
これにより、現在存在するフォルダへのパスを含むconcatenatedfile.txtを作成し、ファイル名>>
で始まるすべてのファイルの内容を同じファイルに追加するだけです。
>
ファイル内容を上書き
>>
ファイルの末尾に追加し、ファイルの上部の内容は変更せずに残します。
答え4
最終的な効果は次のとおりです。
find . -type f -iname 'file.txt' -printf '\n%P\n' -exec cat {} \; > catfile.txt
大文字と小文字を区別せずに、すべてのタイトルを含むファイルを見つけてfile.txt
データをcatfile.txt
。
みんなの助けをありがとう!