다음 사항을 확인해주세요.
awk '/SOURCE/ {print $3}' /MAC/Delete_Name.txt |
while IFS= read -r file; do find /OS/ -iname "$file.pdf" ; done
그러면 다음과 같은 출력이 생성됩니다.
/OS/001DAY/11file/cooke.pdf
우리는 다음과 같이 파일 경로를 인쇄하기를 원합니다.
/OS/001DAY/11file/
답변1
최적화하는 방법이 있습니다(예: -의 내용을 기반으로 정규 표현식을 작성 하고 대신 Delete_Name.txt
-를 사용하므로 한 줄에 한 번이 아니라 한 번만 실행하면 됩니다 ). 그러나 명백한 버그는 $file이 그렇지 않은 것 같다는 것입니다. 어디서나 정의됨 - 출력 을 .find
-iregex
-name
find
Delete_Name.txt
awk
$line
$file
어쩌면 다음과 같이 시도해 보세요:
awk '/SOURCE/ {print $3}' /MAC/Delete_Name.txt |
while IFS= read -r file; do
find /OS/ -iname "$file.pdf"
done | sed -e 's:[^/]*$/::'
(이 내용은 모두 한 줄에 있을 수 있습니다. 가독성을 높이고 이 사이트에서 가로 스크롤 막대를 피하기 위해 여러 줄로 나누었습니다.)
언급된 오류를 수정하는 것 외에도 전체 줄을 한 번에 읽고(줄에 공백이나 탭이 포함된 경우에도) 전체 줄을 $file에 할당하는 옵션도 설정 하여 IFS=
사용했습니다 .-r
while read
다음 버전은 .txt 에 나열된 파일 수에 관계없이 find -regex
한 번만 실행됩니다 . 이 옵션에는 GNU 또는 FreeBSD 버전이 필요합니다.find
/MAC/Delete_Name.txt
find
-iregex
regexp=$(awk '/SOURCE/ {print $3}' /MAC/Delete_Name.txt |
sed -n -e '1,$H; ${ g; s/\n/\\|/g ; s/^\\|//p}')
find /OS/ -iregex ".*\($regexp\)\.pdf$" | sed -e 's:[^/]*$/::'
경고: 에 파일이 많으면 /MAC/Delete_Name.txt
생성된 정규 표현식이 너무 커서 단일 명령줄에 들어갈 수 없으며 명령이 find
실패합니다. 셸, 운영 체제 및 버전에 따라 각 셸 명령줄의 제한은 수천 자일 수 있습니다.
답변2
find
를 사용하면 간단히 이 작업을 수행할 수 있습니다 -printf
. ~에서man find
:
%h Leading directories of file's name (all but the last ele-
ment). If the file name contains no slashes (since it is
in the current directory) the %h specifier expands to
".".
그래서:
awk '/SOURCE/ {print $3}' /MAC/Delete_Name.txt |
while IFS= read -r file; do find /OS/ -iname "$file.pdf" -printf "%h\n" ; done