'find' 출력에서 ​​경로 이름 인용

'find' 출력에서 ​​경로 이름 인용

내가 원하는 것은 find전체 경로 이름을 힘들게 입력하지 않고도 경로 이름 결과를 다른 명령에 대한 인수로 참조할 수 있는 것입니다. 예:

$ find -name testfile  
path1  
path2  
path3  
$ cd path2

누구든지 어떻게 이런 일을 할 수 있습니까?

답변1

Bash에서는 변수에 파일의 전체 경로 값(예: /home/spider/src/myscript.py)이 있는 경우 변수 조작을 사용하여 기본 이름과 디렉터리 이름을 가져올 수 있습니다.

예를 들면 다음과 같습니다.

filepath='/home/spider/src/myscript.py'

filename=${filepath##*/}
echo $filename
myscript.py

path=${filepath%/*}
echo $path
/home/spider/src

Bash에는 -a 옵션을 사용하여 stdin에서 배열로 읽기를 지원하는 읽기 명령이 내장되어 있으므로 다음을 사용할 수 있습니다.

IFS='$\n' read -d '' -a files < <(find . -name testfile -type f)

이제 쉘 배열 변수에는 모든 파일과 해당 경로가 포함됩니다. 이전 쉘 문자열 조작 구성을 사용하여 이제 다음을 수행할 수 있습니다.

cd ${files[2]%/*}

두 번째 파일의 경로로 변경합니다.

위 명령에 대한 몇 가지 참고 사항:

  • -d '' 옵션(-d와 '' 사이의 공백에 주의)은 널 문자를 읽기 구분 기호로 선택합니다.
  • 옵션 -a는 위에 표시된 대로 표준 입력을 인덱스 배열(이 경우 "file"이라고 함)로 읽습니다.
  • < <(명령) <( 및 ) 사이의 명령 출력을 표준 입력으로 리디렉션합니다. 이는 읽기에 편리하지만 파이프를 통해 읽을 수는 없습니다.
  • 파일만 가져올 수 있도록 find 명령에 "-type f"를 추가했습니다.
  • 참고로Bash의 문자열 피연산자
  • basename(1) 및 dirname(1) 명령을 사용하여 동일한 목적을 달성할 수 있지만 새 프로세스를 생성하므로 효율성이 약간 떨어집니다.

답변2

명령문의 일부로 다른 명령을 실행할 수 있습니까 find?

find -name testfile -exec othercommand {} \;

{}발견된 경로입니다. 인수는 -exec세미콜론으로 종료되어야 ;하지만 bash에서 백슬래시로 이스케이프해야 합니다 \.

이 예에서는 발견된 모든 파일의 권한을 변경합니다.

find -name testfile -exec chmod 755 {} \;

관련 정보