有没有办法将文件从文件夹 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' "{}" \;