나는 보통 find 명령을 사용하여 A 디렉터리에서 B 디렉터리로 특정 멀티미디어 파일을 자동으로 복사합니다. 다음 명령을 사용합니다.
for f in `find ./ -name "*.mkv" -mtime -24h`; do cp $f rename/ ; done
이것은 정확히 내가 원하는 작업을 수행하지만 이제 명령을 실행 가능한 스크립트로 옮겼으므로(이렇게 부르면 mmcopy
완벽하게 작동합니다) 다음을 수행하도록 스크립트를 개선할 수 있는지 궁금합니다.
명령줄에 입력 할 때 mmcopy
스크립트에 있는 두 개의 연산자/변수, 즉 파일 확장자에 대한 변수와 mtime 연산자에 대한 변수를 구문 분석하여 복사해야 하는 파일 유형과 복사 빈도를 지정할 수 있습니다. 파일이 있을 수 있습니다.
.jpg
예: 3일이 지난 디렉터리의 (모든) 파일을 자동으로 복사하고 싶습니다 . 명령줄은 다음과 같아야 합니다.mmcopy jpg -3d
이렇게 하려면 스크립트를 어떻게 변경해야 합니까?
답변1
첫째, 현재 스크립트는 공백 및 기타 특수 문자가 포함된 파일 이름에서 중단됩니다. 이 문제를 해결하는 것은 매우 쉽습니다. 변수 대체에는 항상 큰따옴표를 사용하고, -exec
대신 사용하십시오 find
.공백이나 기타 특수 문자 때문에 쉘 스크립트가 멈추는 이유는 무엇입니까?더 많은 정보를 알고 싶습니다.
find . -name "*.mkv" -mtime -24h -exec cp {} rename/ \;
스크립트에 전달된 매개변수는 특수 매개변수 $1
등에서 사용할 수 있습니다. $2
다음 스크립트는 확장자가 스크립트의 첫 번째 인수이고 타임스탬프 비교가 두 번째 인수로 제공되는 파일을 복사합니다.
#!/bin/sh
find . -name "*.$1" -mtime "$2" -exec cp {} rename/ \;
매개변수가 누락되었을 때 기본값을 사용하려면 다음을 사용할 수 있습니다.${…:-…}
매개변수 확장 구조.
#!/bin/sh
find . -name "*.${1:-mkv}" -mtime "${2:--1d}" -exec cp {} rename/ \;
또는 cp
로 교체하는 것이 좋습니다 . 파일에 타임스탬프를 보관하면 파일을 언제 복사했는지 쉽게 알 수 있습니다. 또한 파일이 복사된 경우에는 복사되지 않습니다(원본 파일의 타임스탬프나 크기가 다른 경우 제외).cp -p
rsync -a
cp -p
rsync -a