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*

답변2

를 사용하면 sed예약된 공간을 사용하여 마지막으로 본 디렉터리에 대한 경로를 저장할 수 있습니다.

sed -n '
  /^\..*:$/{
    h;d
  }
  /^Do/{
    G
    s|\(.*\)\n\(.*\):|\2/\1|p
  }'

관련 정보