zot*_*ken 7 command-line scripts copy
有没有办法将文件从文件夹 a 复制到文件夹 b 但在每个文件之间暂停一秒钟?我想将大量文件复制到监视文件夹,但我从经验中知道,如果我一次复制所有文件(通过终端 cp 或 GUI),它将使我的 rtorrent 崩溃...如果我可以复制文件它们之间有第二个间隔,这将使 rtorrent 有时间处理事情。如果我可以通过一个命令来做到这一点,那我就不用手动一一执行了。
Ser*_*nyy 10
在许多选项中,包括使用cp
and 的循环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)