폴더 및 하위 폴더의 파일을 재귀적으로 복사하는 방법은 무엇입니까?

폴더 및 하위 폴더의 파일을 재귀적으로 복사하는 방법은 무엇입니까?

폴더 아래에는 다음과 같은 /home여러 하위 폴더가 있습니다 .

/home/user1
/home/user2/user_sub_2
/home/user3/user_sub_3/info_sub
/home/user4/INFO_FOLDER

/home아래의 모든 파일을 재귀적으로 복사하려고 합니다 /tmp/calculation. 모든 파일은 대상 폴더에 직접 배치되어야 합니다(하위 디렉터리를 생성해서는 안 됨). 두 개 이상의 파일이 동일한 이름을 가지고 있는 경우 가장 최근에 수정된 파일을 에 복사해야 합니다 /tmp/calculation.

이를 수행하는 올바른 방법은 무엇입니까?

답변1

find /home ! -type d -exec bash -c '
    for pathname do
        if [ "$pathname" -nt "/tmp/calculation/${pathname##*/}" ]
        then
            cp "$pathname" /tmp/calculation
        fi
    done' bash {} +

그러면 디렉터리가 아닌 모든 파일이 아래에서 검색 /home되고 해당 파일 배치에 대해 짧은 bash스크립트가 호출됩니다.

짧은 bash스크립트는 현재 경로 이름 배치를 반복하고 각 경로 이름에 대해 -nt현재 파일이 대상 디렉토리의 복사본보다 최신인지(또는 거기에 복사본이 없는지) 테스트합니다. 대상 디렉터리의 파일이 오래되었거나 존재하지 않는 경우 cp현재 파일을 대상 디렉터리에 복사하는 데 사용됩니다 .

매개변수 확장은 ${pathname##*/}실제 파일 이름 앞에 있는 모든 디렉토리 경로를 제거하고 경로 이름의 파일 이름 부분만 남깁니다. 로 대체할 수 있습니다 $(basename "$pathname").

관련된:


대부분 관련이 없음:

-nt테스트는 비표준 테스트입니다. 그래서 통화를 위해 bash내부 스크립트를 선택했습니다 find. sh -c대신 사용이 bash -c가능합니다일했다, 그러나 테스트의 의미는 로 가장할 수 있는 셸마다 약간 다를 수 있습니다 sh.

예를 들어, 및 bash셸 에서 첫 번째 피연산자의 수정 타임스탬프가 두 번째 피연산자의 수정 타임스탬프보다 최신이거나 두 번째 피연산자가 존재하지 않는 경우 테스트는 참입니다.zshksh-nt

그러나 dash쉘 에서는둘 다파일은 대부분 존재하며 문서에 따르면 테스트를 유지하려면 첫 번째 파일이 두 번째 파일보다 최신이어야 합니다. 이 경우 이 차이는 문제가 되지 않습니다.

yash쉘 에서 매뉴얼은 두 파일이 존재하지 않는 경우 어떤 일이 발생하는지 지정하지 않습니다.

따라서 비표준 기능을 사용할 때는 특정 쉘을 사용하는 것이 가장 안전합니다.아마도sh -c어쨌든 이미 함께 일했습니다.

(이것결점이 예에서 사용된 것은 bash비교되는 타임스탬프에서 1초의 해상도만 갖는다는 것입니다. 그러나 이는 또 다른 이야기입니다.)

답변2

다음 명령을 사용해 보았는데 잘 작동합니다.

for file in `find /home -type f | awk -F "/" '{print $NF}'`
do
    for dir in `find . -type d| sed "s/\.//g"| sed 's/$/\//g'`
    do
        sudo find $dir -type f -iname $file | awk '{print "ls -ltrh" " " $0}'
    done | sh | sed -n '$p'
done | awk '{print "cp -rvfp" " " $NF " " "/destinationlocationtocopy/"}' | sh

관련 정보