명령 대체를 위해 xargs 입력 사용

명령 대체를 위해 xargs 입력 사용

특정 디렉터리의 모든 파일에 대한 심볼릭 링크를 생성하는 간단한 명령을 작성하려고 합니다(예, 정확히 동일 lndir하지만 작동시킬 수 없어서 모방하려고 합니다).

find+를 사용하여 다음을 시도했습니다 xargs.

find $(realpath ${FROM_DIR}) -maxdepth 1 -print0 | xargs -0 -I{} ln -sfn {} ${TO_DIR}/$(basename {})

하지만 문제는 쉘이 $(basename {})각 매개변수에 대해가 아니라 라인을 실행하기 전에 한 번 교체된다는 것입니다.

다음과 같이 루프로 작성하세요.

for i in $(find $(realpath ${FROM_DIR}) -maxdepth 1)
do
    ln -sfn $i ${TO_DIR}/$(basename $i)
done

이것은 작동하지만 상대적으로 느립니다. xargs을 사용해도 이 작업을 수행할 수 있는지 궁금합니다 .

답변1

당신이 원하는 것 같아요 :

ln -sf -- "$(realpath -- "$FROM_DIR")"/* "$TO_DIR/"

마지막 인수가 디렉터리인 경우 동일한 기본 이름을 가진 다른 인수에 대한 링크를 ln좋아하거나 cp만듭니다 .mv~에그 디렉토리.

또는 다음을 사용하여 zsh:

ln -sf -- $FROM_DIR:P/* $TO_DIR/

실제 경로를 확인할 수 없거나 $FROM_DIR파일을 $FROM_DIR.

( D한정자를 추가하면 숨겨진 파일에 대한 기호 링크도 생성됩니다).

또는 어떤 이유로 ln파일당 한 번씩 호출해야 하는 경우:

for f ($FROM_DIR:P/*(ND)) ln -sfT -- $f $TO_DIR/$f:t

( -n-T는 비표준 확장입니다.)

xargswith (또는 여기서는 with find -exec, using 은 의미가 없음) 로 바꾸는 쉘 명령을 사용하려면 xargs쉘을 실행하는 데 필요합니다.

TO_DIR=$TO_DIR find "$(realpath -- "$FROM_DIR")" -mindepth 1 -maxdepth 1 \
  -exec sh -c '
    for file do
      ln -sfn -- "$file" "$TO_DIR/$(basename -- "$file")"
    done' sh {} +

그러나 명령 대체는 후행 줄 바꿈을 모두 제거하므로 임의 파일의 명령 대체에는 사용할 수 없다는 점을 명심하십시오 basename(여기서도 동일한 문제 $(realpath)). 여기서는 또는 ( for ) sh를 사용하는 것이 좋습니다 .${file##*/}zsh $file:t$FROM_DIR:Prealpath

여기에는 다음이 필요합니다.

find "$(realpath -- "$FROM_DIR")" -mindepth 1 -maxdepth 1 \
  -exec ln -sft "$TO_DIR" -- {} +

그러나 ( -tGNU 확장도 가능). 그건 영향을 받지 않아요너무 많이 논쟁하다에 파일이 너무 많으면 오류가 발생할 수 있습니다 $TO_DIR( 에서는 zsh내장 버전을 얻기 위해 모듈을 사용하거나 로드하여 이 문제를 해결할 수 있습니다).zargszsh/filesln

시도에 대한 다른 질문은 다음 Q&A를 참조하세요.

관련 정보