可能ですか?そしてキャンセルアルファベット順に?
本質的に、これは次のとおりです。タイプ別にファイルをディレクトリとサブディレクトリから別のディレクトリに再帰的に移動する方法は?
各ファイルがターゲットディレクトリに移動されていないだけです。〜しない限り別のプロセスがそのターゲットディレクトリの唯一のファイルをインポートし、別の場所に移動しました。したがって、ターゲットフォルダは空で、次のファイルをそこに移動できるように「準備」されています。
答え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
一度に1つのファイルを繰り返して値を$FILE
移動する次のファイルに設定します。mv "$FILE" "$DEST"
現在のディレクトリ
$FILE
に移動します$DEST
。inotifywait -e moved_from "$DEST"
設立する
inotify
ファイルが監視ディレクトリの外に移動すると、監視がトリガされます。これにより、$DEST
ディレクトリが空の間スクリプトがブロックされます。$DEST
スクリプトを呼び出すときは空だとします。