sed を使用して ls 出力を解析し、特定の名前のファイルのファイルの場所を取得します。

sed を使用して ls 出力を解析し、特定の名前のファイルのファイルの場所を取得します。

まず、私は人々がよく言及するように、この方法が正しくないことを知っています。lsの出力を解析しない理由しかし、それは私の大学プロジェクトの一部です(したがって、sedとawkの両方を使用できます)。

名前が指定された文字列で始まるファイルを見つける必要があります。私は以下を使用して現在のディレクトリを一覧表示することから始めましたls

ls -LR1

これにより、サンプル出力が提供されます。

.:
bin
etc
games
include
lib
man
sbin
share
src

./bin:
apt
gnome-help
highlight
mint-sha256sum
pastebin
search
szukaj
yelp

./etc:

./games:

./include:

./lib:
python2.7
python3.5

./lib/python2.7:
dist-packages
site-packages

./lib/python2.7/dist-packages:

./lib/python2.7/site-packages:

./lib/python3.5:
dist-packages

./lib/python3.5/dist-packages:

./man:

./sbin:

./share:
ca-certificates
emacs
fonts
man
sgml
xml

./share/ca-certificates:

./share/emacs:
site-lisp

./share/emacs/site-lisp:

./share/fonts:

./share/man:

./share/sgml:
declaration
dtd
entities
misc
stylesheet

./share/sgml/declaration:

./share/sgml/dtd:

./share/sgml/entities:

./share/sgml/misc:

./share/sgml/stylesheet:

./share/xml:
declaration
entities
misc
schema

./share/xml/declaration:

./share/xml/entities:

./share/xml/misc:

./share/xml/schema:

./src:

ここで、名前が与えられた文字列で始まるファイルを使用またはインポートsedしたいと思います。たとえば、次のような結果を得たいと思います。awk'Do'

  1. sed(またはawk?)各行を解析し、次から始まる行を検索します。'Do'
  2. 一致するものがある場合は、前の行に移動して検索してください。 (これは相対パスを表します)、一致するものがない場合は前の行にジャンプするなどの操作を実行します。
  3. 行を相対パスで印刷します。.path/filename

でも可能ですか?ご協力ありがとうございます!

ベストアンサー1

たとえば、次のファイルを見てみましょう。

$ ls -LR1
.:
a

./a:
b

./a/b:
bad
Do_good

それでは、目的のファイルを探してみましょう。

$ ls -LR1 | awk '/^\.\//{sub(/:$/, "/", $0); dir=$0} /^Do/{print dir $0}'
./a/b/Do_good

仕組み:

  • /^\.\//{sub(/:$/, "/", $0); dir=$0}

    aで始まる行が見つかるたびに、./検索をaに置き換えて変数を更新します。:/dir

  • /^Do/{print dir $0}

    で始まる行が見つかるたびに、その行の後Doの変数を印刷します。dir

限定:ご存知のように、出力はls人間が読めるように作成されており、解析は信頼できません。このコードはデモ用にのみawk使用してください。

好ましい方法--1

〜のようにワイルドカード指摘されているのは、find仕事に適したツールです。

$ find . -name 'Do*'
./a/b/Do_good

好ましい方法 - 2(bashが必要)

バッシュでは先行は達成するのが難しいglobstar関数を使用してファイルを再帰的に検索できることを指摘しました。

shopt -s globstar nullglob
printf '%s\n' **/Do*

おすすめ記事