find 및 mv 통합 명령의 로그를 얻는 방법은 무엇입니까?

find 및 mv 통합 명령의 로그를 얻는 방법은 무엇입니까?

저는 특정 파일을 찾아 다른 폴더로 이동하기 위해 스크립트에서 이 명령을 사용하고 있지만, 이동한 파일에 대한 로그를 생성해야 합니다.

find $1* -prune -name "*.$2" -mtime +$3 -exec mv {} $4 \;

로그를 생성하려면 명령에 무엇을 추가해야 합니까?

답변1

주문,

find $1* -prune -name "*.$2" -mtime +$3 -exec mv {} $4 \;

먼저 다음과 같이 작성되어야 합니다.

find "$1"* -prune -name "*.$2" -mtime +"$3" -exec mv {} "$4" \;

그렇지 않으면 이름에 공백이 포함된 디렉터리 및 파일에 사용할 수 없게 됩니다.

이 명령에서 실제로 이동한 항목의 경로 이름을 출력하려면 마지막 항목을 mv추가하면 됩니다 .-print

find "$1"* -prune -name "*.$2" -mtime +"$3" -exec mv {} "$4" \; -print

그러면 지정된 대상으로 성공적으로 이동된 모든 파일(또는 디렉터리)의 경로 이름이 출력됩니다 "$4".

답변2

-exec 앞에 -print를 추가하면 이동하기 전에 파일 이름을 인쇄할 수 있습니다.

답변3

다음 명령을 사용하여 로그 파일에 쓸 -exec다른 블록을 추가 할 수 있습니다 .echo

find $1* -prune -name "*.$2" -mtime +$3 -exec mv {} $4 \; -exec echo mv {} $4 >> /path/to/log \;

더 적은 정보를 원할 경우 마지막 -exec블록을 수정하세요.-exec echo {} >> /path/to/log \;

오류 기록

명령이 성공했는지 여부도 기록하려는 경우 mv명령의 표준 오류를 로그 파일로 파이프할 수도 있습니다. 첫 번째 것이 -exec먼저 작동한다는 보장은 없으므로 -exec이 경우에는 하나를 사용하겠습니다. 여기서 구문은 약간 복잡합니다.

find $1* -prune -name "*.$2" -mtime +$3 -exec mv {} $4 \; -exec sh -c 'echo mv $1 $2 >> /path/to/log; mv $1 $2 2>> /path/to/log' . {} $4 \;

몇 가지 의견

find "$1"* …정확한 사용 사례는 잘 모르겠지만 파일 이름에 공백 등이 있는 경우 변수를 인용하는 것이 좋습니다 . 그중에서.

둘째, . -execdir보다 우선합니다 -exec. 에서 man find:

-exec 작업을 사용할 때 피할 수 없는 보안 문제가 있으므로 -execdir 옵션을 사용해야 합니다.

mv -v 대신

또는 Steeldriver의 말에 따르면논평, 귀하의 버전이 mvverbose -v옵션을 지원하는 경우 원본 -exec블록을 다음과 같이 수정할 수 있습니다.

-exec mv -v {} $4 >> /path/to/log \;

그러면 와 유사한 출력이 제공됩니다 renamed 'foo' -> 'bar'.

관련 정보