파일을 이동하고 소프트 링크를 뒤에 둡니다


10

나는 이것과 동등한 것을 할 수있는 단일 리눅스 명령을 찾고있다.

cp /some/path/file /another/path/ && ln -sf /another/path/file /some/path/

파일이 없으면 많은 파일을 처리하는 가장 좋은 방법은 무엇입니까?


나는 Bash 스크립팅을 작성하기에 충분히 알지 못하지만 내 해결책은 스크립트를 작성하고 cpln과 같은 무언가를 부를 것입니다.
Unkwntech

1
cp가 mv가 아니어야합니까?
바트 반 Heukelom

ln에 대한 -f 옵션이이를 처리합니다.
innaM

1
10GB의 파일에 그것을 시도
hayalci

2
@HelloGoodbye 당신은 혼란 스럽 &&습니다 &. 작성된대로, 행은 cp의 리턴 값을 점검하고 성공한 경우에만 두 번째 부분을 실행합니다.
itsadok

답변:


7

참고로, ln을 두 번 사용하여 명령이 실제로 데이터를 이동하지 않도록 할 수 있습니다 (두 경로가 동일한 파일 시스템에 있다고 가정).

ln /some/path/file /another/path/ && ln -sf /another/path/file /some/path/

그러나 / some / path /의 내용을 다른 디스크로 이동 한 다음 새 파일에 대한 링크를 만들어 "아무도 없음"으로 표시한다고 가정합니다.

for f in `ls /some/path/`; do ln /some/path/$f /another/path/ && ln -sf /another/path/$f /some/path; done

bash 함수로 감싸기 :

function cpln {
    for f in `ls $1`
    do
        ln $1/$f $2 && ln -sf $2/$f $1
    done
}

내가 옮기는 것이 디렉토리 인 경우이 작업을 수행 할 수있는 방법이 있습니까?
tladuke

디스크에서 실제 파일을 어떻게 이동합니까?
Ibrahim

이브라힘 : 데이터가 이동하지 않고 디렉토리의 포인터 만 업데이트합니다.
Mr Shark

tladuke : 그렇습니다. 디렉토리는 디스크에서 훨씬 더 작기 때문에 ln 트릭 (디렉토리에서는 작동하지 않음)이 필요하지 않습니다. mv :-)를 수행하십시오.
Mr. Shark

2

내 스크립트를 사용할 수 있습니다 (/ some / path / file 및 / another / path / 매개 변수 두 개 사용).

#!/bin/bash
cp $1 $2
if [ "$?" -ne "0" ]; then
    echo "Some error"
    exit 1
    fi
ln -sf $2/${1##*/} ${1%/*}

문자열 조작으로 멋진 트릭을 본 적이 없었습니다. 감사!
itsadok

1

진지하게, 나는 이것이 정말로 쉬운 질문이라고 생각했다.

펄에서 할 수있는 일은 다음과 같습니다.

#!/bin/perl
# Usage: cpln TARGETDIR SOURCE...
# Example: find tree/ -type f | xargs cpln commands/

$target = shift;

foreach(@ARGV) {
    m[(.*)/([^/]+)];
    system("cp $_ $target");
    system("ln -sf $target/$2 $1/");
}

나는 더 우아한 것을 원했지만 그것을 사용할 것이라고 생각합니다.


1
"Perl에서"수행하려면 File :: Copy (또는 이와 유사한) 및 symlink ()를 사용해야합니다. 펄은 껍질이 아니다. system ()을 피하고 특히 전체 명령 행을 system ()에 전달하지 마십시오 (예 : 인수에 공백이 있으면 어떻게됩니까?). 항상, 항상, 항상 리턴 값을 점검하십시오.
존 시라쿠사
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.