가능합니까? 그리고취소알파벳순으로?
본질적으로 이는 다음과 같습니다.유형별로 파일을 디렉터리 및 하위 디렉터리에서 다른 디렉터리로 재귀적으로 이동하는 방법은 무엇입니까?
단지 각 파일이 대상 디렉터리로 이동되지 않은 것뿐입니다.~하지 않는 한별도의 프로세스가 해당 대상 디렉터리의 유일한 파일을 가져와 다른 곳으로 이동했습니다. 따라서 대상 폴더는 비어 있고 다음 파일을 그곳으로 이동할 수 있도록 "준비"되어 있습니다.
답변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'
수 있으므로 개행 문자로 올바르게 해석할 수 있습니다.bash
string
$'\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
스크립트를 호출할 때 비어 있다고 가정합니다 .