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
initial-arguments
표준 입력에서 읽은 이름 으로 항목을 바꿉니다 . 또한 따옴표가 없는 공백은 항목을 종료하지 않으며 대신 구분 기호는 개행 문자입니다. 힌트-L 1
.-L max-lines
max-lines
명령줄당 최대 공백이 아닌 입력 줄을 사용하세요.