파일을 재귀적으로 이동합니다. 단, 다른 프로세스에서 열지 않은 경우에만 해당됩니다.

파일을 재귀적으로 이동합니다. 단, 다른 프로세스에서 열지 않은 경우에만 해당됩니다.

파일 권한, 소유자를 변경하고 파일이 다른 프로세스에서 열려 있지 않은 경우 파일을 이동하려면 아래 스크립트 텍스트를 수정하고 싶습니다.

cd /mnt/usbdrive/DVR
sudo chown 777 -R /mnt/usbdrive
sudo chmod 777 -R /mnt/usbdrive
find .  -mindepth 2 -type f -name '*.ts' -exec mv -t /mnt/usbdrive {} +

답변1

귀하의 경우 간단하고 효율적인 find 명령은 다음과 같습니다.

find .  -mindepth 2 -type f -name '*.ts' -exec fuser -s {} \; -a -exec mv /mnt/usbdrive {} \;

여기서는 :note 연산자("and"를 의미함) find의 표현력을 활용하여 0으로 종료되는 경우에만 실행 되도록 합니다 . 이는 파일이 열려 있음을 의미합니다.-amvfuser

이는 가장 안전한 명령이며 파일 이름에 포함될 수 있는 모든 문자를 처리할 수 있습니다.

그러나 이 명령은 디렉토리에 파일이 많으면 속도가 매우 느려질 수도 있습니다. 실제로 이러한 부담을 완화하기 위해 {} +옵션 mv라인 에 구문을 사용했습니다.-t

 불행 하게도 우리는 -exec이 두 가지 작업에 이 구문을 사용할 수 없습니다 .fuser누구나표시된 파일이 열려 있고 어떤 파일이 find.

여기서는 여전히 구문을 사용할 수 있지만 {} + 더 복잡한 명령이 필요합니다. 이 같은:

find . -mindepth 2 -type f -name '*.ts' -exec fuser {} + 2>&1 | sed 's/^\(.\+\):.*/\1/' | xargs mv -t /mnt/usbdrive

사용된 것을 분석하면 -exec기본적 find으로 fuser모든 파일을 한 번에 고려하지만 sed를 통해 출력을 필터링하여 파일 이름(출력 PID 및 파일 이름)만 가져오고 결국  실행 중인 Original 명령 fuser으로 한 번에 모두 파이핑합니다 . 테스트 목적으로 확인 시 무엇이 이동되는지 확인하는 옵션을 추가하는 것이 좋습니다 .xargsmv-pxargs

그런 다음 권한과 소유자를 변경하고 싶다고 말한 것도 확인했습니다.와는 별개로chown파일이 열려 있지 않은 경우에만 파일을 이동하세요. 하지만 미리 전체 디렉터리에 대해 더하기 기호를 표시 한 것을 확인했습니다 . chmod(그런데, chown 777777이 실제로 시스템의 사용자 ID가 아닌 이상 거기에 사용자 이름을 입력한다는 것은 전혀 의미가 없습니다. 그러나 의심스럽습니다.)

따라서 말한 대로 수행하려면 xargs이러한 명령을 복합 명령으로 패키징하여 셸에 추가할 수 있습니다.

이와 같이:

find . -mindepth 2 -type f -name '*.ts' -exec fuser {} + 2>&1 | sed -e 's/^\(.\+\):.*/\1/' | xargs sh -c 'echo sudo chmod 777 "${@}"; echo sudo chown user "${@}"; echo mv -t /mnt/usbdrive "${@}"' --

사실 이건 그냥프로그램실행될 명령입니다. 시도해 보시고 실제로 적용할 준비가 되면 s 를 제거하시기 바랍니다 echo.

중요한 팁:find의 구문 사용을 허용하는 후자의 두 명령은 {} +개행 문자가 포함된 파일 이름을 처리할 sed수 없지만 fuser의 특정 출력으로 인해 더 복잡해집니다. 나는 당신의 파일 이름에 개행 문자가 포함되어 있지 않다고 가정하는 것이 합리적이라고 생각합니다. 그렇지 않으면 첫 번째 더 간단하지만 느린 명령을 사용할 수도 있습니다.

관련 정보