내가 원하는 것은 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 {} \;