一部のスクリプト名とそのパスはテキストファイルに保存されています。テキストファイルには、次のようなパスが含まれています。
/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.sh
。testo4bar.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