./ 없이 검색결과를 사용하세요.

./ 없이 검색결과를 사용하세요.

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/{}'

man find

  • -print0표준 출력에 전체 파일 이름과 그 뒤에 한 null 문자를 인쇄합니다.

man cut- 파일의 각 줄에서 부분을 제거합니다.

  • -z줄 구분 기호는 NUL개행 문자가 아닌 입니다.
  • -c다음 문자만 선택하세요.
  • N-N번째 바이트, 문자 또는 필드(1부터 계산)부터 줄 끝까지.

man xargs- 표준 입력에서 명령줄을 작성하고 실행합니다.

  • xargs [options] [command [initial-arguments]]
  • -0항목은 공백이 아닌 문자로 끝나며 null따옴표와 백슬래시는 특별하지 않습니다(각 문자는 문자 그대로 사용됩니다).
  • -I replace-strreplace-strinitial-arguments표준 입력에서 읽은 이름 으로 항목을 바꿉니다 . 또한 따옴표가 없는 공백은 항목을 종료하지 않으며 대신 구분 기호는 개행 문자입니다. 힌트 -L 1.
  • -L max-linesmax-lines명령줄당 최대 공백이 아닌 입력 줄을 사용하세요.

관련 정보