대상 폴더가 비어 있는 경우에만 파일을 하나씩 디렉터리로 자동 이동합니다.

대상 폴더가 비어 있는 경우에만 파일을 하나씩 디렉터리로 자동 이동합니다.

가능합니까? 그리고취소알파벳순으로?

본질적으로 이는 다음과 같습니다.유형별로 파일을 디렉터리 및 하위 디렉터리에서 다른 디렉터리로 재귀적으로 이동하는 방법은 무엇입니까?

단지 각 파일이 대상 디렉터리로 이동되지 않은 것뿐입니다.~하지 않는 한별도의 프로세스가 해당 대상 디렉터리의 유일한 파일을 가져와 다른 곳으로 이동했습니다. 따라서 대상 폴더는 비어 있고 다음 파일을 그곳으로 이동할 수 있도록 "준비"되어 있습니다.

답변1

이런 걸 원하시나요?

#!/usr/bin/env bash
## This is the target path, the directory
## you want to copy to.
target="some/path with/spaces";

## Find all files and folders in the current directory, sort
## them reverse alphabetically and iterate through them
find . -maxdepth 1 -type f | sort -r | while IFS= read -r file; do
    ## Set the counter back to 0 for each file
    counter=0;
    ## The counter will be 0 until the file is moved
    while [ $counter -eq 0 ]; do
      ## If the directory has no files
      if find "$target" -maxdepth 0 -empty | read; 
      then 
          ## Move the current file to $target and increment
          ## the counter.
          mv -v "$file" "$target" && counter=1; 
      else
          ## Uncomment the line below for debugging 
          # echo "Directory not empty: $(find "$target" -mindepth 1)"

          ## Wait for one second. This avoids spamming 
          ## the system with multiple requests.
          sleep 1; 
      fi;
    done;
done

모든 파일이 복사될 때까지 스크립트가 실행됩니다. 대상이 비어 ​​있으면 파일을 복사하기만 하므로 $target다른 프로세스가 파일이 들어올 때 삭제하지 않는 한 영원히 정지됩니다.

$target파일 이름이나 파일에 줄 바꿈( )이 포함되어 있으면 문제가 발생 \n하지만 공백이나 기타 이상한 문자는 문제가 없습니다.

답변2

사용하기 쉬운 간단한 솔루션inotify-wait~에서inotify-tools:

#!/bin/bash
SOURCE=$1
DEST=$2
(
IFS=$'\n'
for FILE in $(find "$SOURCE" -type f | sort -r); do
  mv "$FILE" "$DEST"
  inotifywait -e moved_from "$DEST"
done
)

설명하다:

  • (IFS=$'\n' ...)

    $IFS내부 필드 구분 기호가 줄 바꿈으로 설정된 하위 쉘에서 스크립트 본문을 실행하면 for루프가 공백이 있는 파일 이름을 올바르게 처리할 수 있습니다. 이 구문을 사용 하면 의 이스케이프 시퀀스를 올바르게 해석할 $'string'수 있으므로 개행 문자로 올바르게 해석할 수 있습니다.bashstring$'\n'

  • for FILE in $(find $SOURCE -type f | sort -r)

    및 해당 하위 디렉터리에 있는 파일의 역순 목록을 작성 $SOURCE하고 한 번에 하나의 파일을 반복하여 값을 $FILE이동할 다음 파일로 설정합니다.

  • mv "$FILE" "$DEST"

    현재 디렉토리 $FILE로 이동합니다 $DEST.

  • inotifywait -e moved_from "$DEST"

    설립하다inotify파일이 감시 디렉터리 밖으로 이동되면 감시가 트리거됩니다. 이로 인해 $DEST디렉터리가 비어 있는 동안 스크립트가 차단됩니다 . $DEST스크립트를 호출할 때 비어 있다고 가정합니다 .

관련 정보