![在 Linux 中用于复制/移动/删除的排队文件程序?](https://linux22.com/image/1215037/%E5%9C%A8%20Linux%20%E4%B8%AD%E7%94%A8%E4%BA%8E%E5%A4%8D%E5%88%B6%2F%E7%A7%BB%E5%8A%A8%2F%E5%88%A0%E9%99%A4%E7%9A%84%E6%8E%92%E9%98%9F%E6%96%87%E4%BB%B6%E7%A8%8B%E5%BA%8F%EF%BC%9F.png)
我在网上搜索 Linux 对 Teracopy(Windows)之类的问题的答案......但没有找到任何合适的东西。
我得到的最接近的东西是:
- Krusader。在其功能中提到但表示“尚未实现”。
- MiniCopier。一款基于 Java 的应用程序http://a.courreges.free.fr/projets/minicopier/minicopier-en.php
rsync
不是一个选择。
有人能推荐一款简单的文件复制工具给我吗?它可以将文件排队进行复制/移动/删除?最好能从 Nautilus 进行拖放。
如果不存在这样的东西,有人可以告诉我为什么吗?...我是唯一需要这样东西的人吗?
答案1
我刚刚编写了这个简单的脚本(我称之为“cpw”)来解决这个问题。
使用它就像使用 cp 一样... 唯一的区别是它在启动时会构建一个已在运行的任何 cpw 进程的数组,并等待它们完成,然后再将命令传递给 cp。这样,它就像一个自组织队列。
您可以继续添加后台 cpw 作业,但它们不会互相影响。它们将一次执行一个。
我确信其他人也可以提出改进建议。
#!/bin/bash
cpwpids=(`ps -ef | grep $USER | grep 'cpw' | grep -v grep | grep -v $$ | awk '{ print $2 }'`) #build an array of all cpw procs for this user that aren't this one.
cpwcnt=${#cpwpids[@]} # number of elemenets in the above array
cnt=$cpwcnt # counter to be decremented each pass
while [ $cnt -gt 0 ]
do
cnt=$cpwcnt
for i in "${cpwpids[@]}" # check if each pid has died yet
do
ps --pid $i >/dev/null
if [ $? -gt 0 ]
then
let "cnt -= 1"
fi
done
sleep 2
done
cp -v "$@" >> /tmp/cpw.log #log
使用示例:
$ cpw -R /src/tree /dest/tree &
答案2
由于 Josh Arenberg 提供的脚本可能存在一些死锁问题(到目前为止我还没有遇到过,但也没有调查过),所以我自己编写了一些脚本。它应该不会有死锁问题。它也适用于任何 shell 命令,而不仅仅是 cp。
Contents of ~/bin/q
#!/bin/bash
#this waits for any PIDs to finish
anywait(){
for pid in "$@"; do
while kill -0 "$pid" 2&>1 >/dev/null; do
sleep 0.5
done
done
}
PIDFILE=~/.q.pid
#open PIDFILE and aquire lock
exec 9>>$PIDFILE
flock -w2 9 || { echo "ERROR: flock() failed." >&2; exit 1; }
#read previous instances PID from PIDFILE and write own PID to PIDFILE
OLDPID=$(<$PIDFILE)
echo $$>$PIDFILE
#release lock
flock -u 9
#wait for OLDPID
anywait $OLDPID
#do stuff
"$@"
#afterwards: cleanup (if pidfile still contains own PID, truncate it)
flock -w2 9 || { echo "ERROR: flock() failed." >&2; exit 1; }
if [ $(<$PIDFILE) == $$ ]; then
truncate -s0 $PIDFILE
fi
flock -u 9
它创建了一个进程链,每个进程都在等待前一个进程。如果链中间的进程在等待时崩溃(可能性不大,但并非不可能),则该链将被破坏,并且两个部分将并行运行。如果其中一个进程被终止,也会发生同样的情况。
用法如下:
q $COMMAND $ARGS
甚至
q $COMMAND $ARGS; $ANOTHER_COMMAND $MORE_ARGS
测试例如输入
q sleep 10 &
q echo blubb &
并发现 10 秒后打印出了 blubb。
答案3
答案4
创建文件列表并使用 SCP 执行复制。Linux 的优点是您可以使用 echo 将其添加到文本文件中。