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

zot*_*ken 7 command-line scripts copy

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

Ser*_*nyy 10

单命令解决方案

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

find ~/dir_1/ -type f -maxdepth 1  -exec cp {} ~/dir_2 \;  -exec sleep 1   \;
Run Code Online (Sandbox Code Playgroud)

这里的选项是:

  • ~/dir_1,原始目录,通过它find工作。
  • -type f 只获取文件
  • -maxdepth 1在目录树中最多下降 1 级;防止下降到子目录
  • -exec cp {} ~/dir_2 \;{}参数指定的当前处理文件复制到~/dir_2. 在\;对候任cp在时间的折来折尽可能多的文件尽可能为处理单个文件{}。反斜杠 in\;是必要的,以防止 shell 将其误解为命令终止符。
  • exec sleep 1 \;sleep 1每个当前文件执行。

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

xargs -I % --arg-file=input.txt sh -c 'cp % ~/dir_2/ ;sleep 1'
Run Code Online (Sandbox Code Playgroud)

这里的选项是:

  • -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
Run Code Online (Sandbox Code Playgroud)

为清楚起见,这是在多行上格式化的,但这也可以作为单行使用。你也可以把它变成一个函数:

delaycp(){
    for f in "$1"/*; do
        cp "$f"  "$2"/
        sleep 1
    done
}
Run Code Online (Sandbox Code Playgroud)

并将其用作

delaycp "/path/to/folder1" "/path/to/folder2"
Run Code Online (Sandbox Code Playgroud)

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

/path/to/folder_1/file1
/path/to/folder_1/file2
/path/to/folder_1/file3
Run Code Online (Sandbox Code Playgroud)

从那里利用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
Run Code Online (Sandbox Code Playgroud)

  • @DennisWilliamson 对文件不以“\n”换行符结尾的情况提供额外保护。创建此文件作为示例:`printf "Line one\nLine two" &gt; input.txt`。没有那个 or 子句的 while 循环只会得到“第一行”。为什么 ?因为内置的 `read` 只有在行以 `\n` 结尾时才返回成功。`Line two` 仍然会在 `line` 变量中结束,但是 `read` 将返回失败退出状态。所以这就是为什么我们需要额外检查变量是否为非空的原因。 (2认同)