将文件从一个文件夹复制到另一个文件夹,但每个文件之间留有间隔

将文件从一个文件夹复制到另一个文件夹,但每个文件之间留有间隔

有没有办法将文件从文件夹 a 复制到文件夹 b,但在每个文件之间暂停一秒钟?我想将大量文件复制到监视文件夹,但从经验中我知道,如果我一次复制所有文件(通过终端 cp 或 GUI),这将导致我的 rtorrent 崩溃...如果我可以以一秒钟的间隔复制文件,这将给 rtorrent 时间来处理事情。如果我可以通过一个命令做到这一点,那就省去了我手动逐个执行操作的时间。

答案1

单一命令解决方案

在许多选项中,包括利用cp和的循环sleep,我们可以选择find使用两个-exec标志来运行这些精确的命令。

find ~/dir_1/ -type f -maxdepth 1  -exec cp {} ~/dir_2 \;  -exec sleep 1   \;

这里的选项是:

  • ~/dir_1,原始目录,通过它find可以工作。
  • -type f仅获取文件
  • -maxdepth 1在目录树中最多向下下降 1 级;防止下降到子目录
  • -exec cp {} ~/dir_2 \;将参数指定的当前正在处理的文件复制{}~/dir_2\;指定cp一次处理单个文件,而不是将尽可能多的文件添加到 中{}。 中的反斜杠\;是必需的,以防止 shell 将其误解为命令终止符。
  • exec sleep 1 \;sleep 1按每个当前文件执行。

如果文件中有文件列表,则可以执行以下操作:

xargs -I % --arg-file=input.txt sh -c 'cp % ~/dir_2/ ;sleep 1'

这里的选项有:

  • -I %指定命令中引用文件的符号
  • --arg-file=input.txt从特定文件读取命令的参数
  • sh -c 'cp % ~/dir_2/ ;sleep 1'/bin/sh使用标志提供的命令执行-c '...'%将被文件名替换。

循环解决方案

例如,您可以使用 for 循环

for f in "/path/to/folder_1"/*; do
    cp "$f"  "/path/to/folder_2/"
    sleep 1
done

为了清晰起见,此内容被格式化为多行,但作为一行也同样有效。您也可以将其转换为函数:

delaycp(){
    for f in "$1"/*; do
        cp "$f"  "$2"/
        sleep 1
    done
}

并将其用作

delaycp "/path/to/folder1" "/path/to/folder2"

或者,如果您只想复制某些文件,而不是*glob 在目录中捕获的所有内容,您可以始终使用路径名扩展,例如file{1..25},或者输入文本文件,如下所示input.txt

/path/to/folder_1/file1
/path/to/folder_1/file2
/path/to/folder_1/file3

并从那里利用while IFS= read -r line结构读取文件:

while IFS= read -r line || [ -n "$line" ]; do
    cp "$line" "/path/to/folder_2/${line##*/}"
    sleep 1
done < input.txt

答案2

parallel

这是一个parallel 平行安装parallel解决方案,给予与:::完全相同的参数cp或使用文件列表:

parallel -j1 'cp {} /path/to/dir2/;sleep 1' ::: /path/to/dir1/* # or
parallel -j1 'cp {} /path/to/dir2/;sleep 1' :::: /path/to/file_list.txt

-j选项指示一次parallel只运行1作业,而不是并行运行作业,单引号仅包含脚本,其中{}替换为当前处理的文件,并:::分别::::引入参数列表或文件。请man parallel参阅很多更多的。

find -exec

find提供了一种对结果运行命令的便捷方法,例如复制.log当前目录中及当前目录下的每个文件:

find -name "*.log" -exec sh -c 'cp "$0" /path/to/dir2/;sleep 1' "{}" \;

相关内容