计划在Linux中将文件排队以进行复制/移动/删除?


10

我已经在网上搜索Linux对Teracopy(Windows)之类的答案...但是找不到合适的东西。

我得到的最接近的东西是:

有人可以向我推荐一个简单的文件复制工具,该工具可以将文件排队以进行复制/移动/删除吗?最好是可以从Nautilus拖放。

如果不存在这种情况,请有人告诉我为什么吗?...我是唯一需要这种东西的人吗?


2
如果您可以确切解释您想要什么,那将很有用。我想大多数Linux用户对“ Teracopy”都不熟悉。
珀尔帖

1
这是因为大的复制和删除操作需要花费时间,并且GUI界面在运行时不可用/不太有用吗?
dmckee ---前主持人小猫,

这一要求的部分原因可以在这里找到:superuser.com/questions/9284/...
dmckee ---前主持人小猫

请稍等,MiniCopier是否不适用于Linux?这是一个Java应用程序。
瑞安·汤普森

1
@Tobu Terracopy可以排队和暂停多个复制作业
Kokizzu 2015年

Answers:


3

我只是写了这个简单的脚本来解决这个问题,我称之为“ 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 &

只是警告,我已经尝试过该脚本,并且由于没有进一步研究的原因,它可能会无限期地挂起,以等待其他脚本完成。在bash中实现排他性的更可靠方法是使用flock -e。例如,见这里:stackoverflow.com/questions/17996577/...
px1mp

1

以我的经验,在Linux中同时进行几个拷贝并不会真正降低整体吞吐量。我对吞吐量的测量基于rsync的-P参数。我的特殊情况是同时从USB硬盘驱动器中复制多个充满大文件的文件夹。

因此,除非您一次要复制很多东西,否则应该没问题。


很抱歉,但这更像是一条评论。很多意见,并不是真正的答案。
Mrchief

1

由于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。


有时我会得到行的权限被拒绝错误while kill -0 "$pid" 2&>1 >/dev/null; do。有任何想法吗?
Mrchief

好的,所以使用了很长一段时间后,我可以说它不起作用。也许访问错误是它的原因,但我可以看到多个cp互相踩踏。
Mrchief


0

我不知道Linux会有这样的事情(尽管这并不是说某个地方没有)。Linux软件倾向于由Linux用户编写。有经验的Linux用户可能不会考虑创建这样的工具,因为如果他们在GUI会话期间发现副本速度变慢,则很可能会切换到终端并通过命令行进行复制。

以下是一些基本的命令行复制实用程序,它们非常快速且不会影响您的桌面环境:

  • cp(“ cp foo / path / to / bar”会将foo复制到bar)
  • mv(“ mv foo / path / to / bar”会将foo移动(重命名)到bar)
  • tar(“ tar cf-foo |(cd / path / to / archive /; tar xf-)”将递归复制目录)
  • rsync(“ rsync -r foo / path / to / archive /”将递归复制目录)

0

创建文件列表,然后使用SCP进行复制。在Linux中,最妙的是您可以使用echo将其添加到文本文件中。


0

我找到了一个名为Task Spooler的Unix Batch System项目,它使您可以排队任务。

或者你可以做 sudo apt-get install task-spooler

安装后,您可以简单地将ts(或tsp对于Ubuntu / Debian系统)放在任何常规shell命令前面以使其排队。

此页面提供了许多有关其用法的示例:https : //www.ostechnix.com/add-linux-commands-queue-execute-one-one/或您在此处观看视频:https : //www.youtube.com / watch?v = wv8D8wT20ZY

我验证了它,并且似乎对我所有的cp命令都可以正常工作。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.