
find를 사용하여 여러 개의 심볼릭 링크를 생성하려고 하는데 {}와 함께 결과를 사용하면 각 파일 이름 앞에 ./가 포함됩니다. 어떻게 하면 이를 피할 수 있나요?
find . -type l -name '*.h' -exec ln -s /sourcedir/{} /destinationdir/{} \;
답변1
명령에서 문자 하나만 변경하면 됩니다.
find * -type l -name '*.h' -exec ln -s /sourcedir/{} /destinationdir/{} \;
# ^
답변2
다음과 같은 표준 구문을 사용하십시오.
S=/sourcedir D=/destdir find . -type l -name '*.h' -exec sh -c '
for i do
ln -s -- "$S${i#.}" "$D/$i"
done' sh {} +
GNUisms를 사용하려면 다음을 수행할 수 있습니다.
find . -type l -name '*.h' -printf '/sourcedir/%P\0/destdir/%P\0' |
xargs -r0n2 ln -s
아니면 만약에/sourcedir
~이다현재 디렉토리:
find "$PWD" -type l -name '*.h' -printf '%p\0/destdir/%P\0' |
xargs -r0n2 ln -s
답변3
find
인수로 제공한 경로를 기준으로 이름을 인쇄합니다. 이 경우 경로는 .
이므로 모든 이름이 로 시작됩니다 ./
. 절대 경로를 얻으려면 절대 경로를 입력으로 제공해야 합니다.
find "$PWD" -type l -name '*.h'
이 명령은 $PWD
현재 작업 디렉터리의 절대 경로가 포함된 환경 변수를 사용하므로 원래 명령의 의미를 유지해야 합니다.
답변4
find . -type l -name '*.h' -print0 | cut -z -c3- \
| xargs -0 -I '{}' ln -s '/sourcedir/{}' '/destinationdir/{}'
-print0
표준 출력에 전체 파일 이름을 인쇄하고 그 뒤에 문자가 옵니다null
.
man cut
- 파일의 각 줄에서 섹션을 제거합니다.
-z
줄 구분 기호는NUL
개행 문자가 아닌 입니다.-c
이 문자만 선택하세요.N-
N번째 바이트, 문자 또는 필드(1부터 계산)부터 줄 끝까지.
man xargs
- 표준 입력에서 명령줄을 작성하고 실행합니다.
xargs [options] [command [initial-arguments]]
-0
입력 항목은 공백 대신 문자로 종료되며null
따옴표와 백슬래시는 특별하지 않습니다(모든 문자는 문자 그대로 간주됩니다).-I replace-str
replace-str
in의 항목을initial-arguments
표준 입력에서 읽은 이름으로 바꿉니다 . 또한 따옴표가 없는 공백은 입력 항목을 종료하지 않습니다. 대신 구분 기호는 개행 문자입니다. 을 암시합니다-L 1
.-L max-lines
max-lines
명령줄당 최대 공백이 아닌 입력 줄을 사용하세요 .