txt ファイルをリンクし、ディレクトリ名を保持します。

txt ファイルをリンクし、ディレクトリ名を保持します。

何千もの.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

みんなの助けをありがとう!

関連情報