grepはテキストファイルからファイル名を読み取り、それを呼び出したシェルファイルの名前をテキストに印刷します。

grepはテキストファイルからファイル名を読み取り、それを呼び出したシェルファイルの名前をテキストに印刷します。

一部のスクリプト名とそのパスはテキストファイルに保存されています。テキストファイルには、次のようなパスが含まれています。

 /myhome/new1/myfiles/test2.sh
 /myhome/new3/myfiles/test1.sh
 /myhome/new2/myfiles/test4.sh
 /myhome/new/myfiles/test5.sh

このシェルファイルは、いくつかの基本スクリプトによって呼び出されます。

  • ルートを選択したいです。パスにはデフォルトのパスがあります(パスの取得方法がわからず、最後の区切り文字を送信できません)。

  • sed 's/.*\///' new.txtファイル名をgrepして(使用されたファイル名を取得するために)保存したいと思います。シェル型ファイル名スクリプトはテキストファイルに書き込みます。

出力テキストファイルパス、スクリプト名、デフォルトのスクリプト名と同じでなければなりません。

 /myhome/new1/myfiles/test2.sh  test2    test2main.sh
 /myhome/new3/myfiles/test1.sh  test1    test1foo.sh
 /myhome/new2/myfiles/test4.sh  test4    test4bar.sh
 /myhome/new/myfiles/test5.sh   test5    baz5main.sh

test2main.sh、、...はこれらのファイルを呼び出す主なスクリプトですtest1foo.shtesto4bar.sh

ベストアンサー1

これを達成するには、次のスクリプトを使用できます。あなたの質問によると、各入力ファイルの「マスター」ファイルを正確に決定する方法は明確ではありません。以下のスクリプトでは、そのファイルがフォルダ内の他の唯一のファイルであると想定しています。

#!/usr/bin/env bash

while IFS= read -r f  # every line is represented by $f
do
    d=$(dirname "$f") # $f's directory
    b=$(basename "$f") # $f's basename
    bwoe=${b%.*} # $f's basename without extension
    m=$(find "$d" -mindepth 1 -maxdepth 1 -not -name "$b" | head -n 1) # get first file in the folder that is not $f
    m=$(basename "$m") # basename of main file
    printf "%s\\t%s\\t%s\\n" "$f" "$bwoe" "$m"
done < input.txt # input.txt contains the input scripts

例:

$ ls a b c
a:
afoo.sh  a.sh

b:
bmain.sh  b.sh

c:
c.sh  cxx.sh
$ cat input.txt 
a/a.sh
b/b.sh
c/c.sh
$ bash script.sh 
a/a.sh  a       afoo.sh
b/b.sh  b       bmain.sh
c/c.sh  c       cxx.sh

おすすめ記事