우선 저는 사람들이 자주 언급하는 것처럼 이 방법이 옳지 않다는 것을 압니다.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'
sed
(또는awk
?) 각 줄을 구문 분석하고 다음으로 시작하는 줄을 검색합니다.'Do'
- 일치하는 항목이 있으면 이전 행으로 이동하여 검색하세요. (이것은 상대 경로를 나타냅니다), 일치하는 항목이 없으면 이전 줄로 점프하는 등의 작업을 수행합니다.
- 행을 상대 경로로 인쇄합니다.
.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
}'