폴더 아래에는 다음과 같은 /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
셸 에서 첫 번째 피연산자의 수정 타임스탬프가 두 번째 피연산자의 수정 타임스탬프보다 최신이거나 두 번째 피연산자가 존재하지 않는 경우 테스트는 참입니다.zsh
ksh
-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