파일 이름 없이 파일 경로 찾기 및 인쇄

파일 이름 없이 파일 경로 찾기 및 인쇄

다음 사항을 확인해주세요.

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-namefindDelete_Name.txtawk$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=사용했습니다 .-rwhile read

다음 버전은 .txt 에 나열된 파일 수에 관계없이 find -regex한 번만 실행됩니다 . 이 옵션에는 GNU 또는 FreeBSD 버전이 필요합니다.find/MAC/Delete_Name.txtfind-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 

관련 정보