我想将文件从一个文件夹(图片)递归移动到另一个(Picturesnew)。
“图片”文件夹具有许多子文件夹,因此在跟踪此处的帖子之后,我使用了此命令。
图片和Picturesnew都在同一目录中。我只是想摆脱所有子文件夹并合并数据。
我从这些文件夹所在的目录中运行以下命令。
find ./Pictures -type f -name "*.jpg" -print0 |
xargs -0 -Imysongs mv -i mysongs ./Picturesnew
现在看来应该出现的Picturesnew文件夹根本没有出现,因此我对我的20000个JPG文件去向感到困惑。
我认为您可以通过以下命令来实现您的目标:
find Pictures -type f -print0 | xargs -0 mv -t Picturesnew
其中Pictures
,源目录Picturesnew
是目标目录。
两者mv
(和cp
)的格式mv -t directory source...
都适合与一起使用xargs
。
但是此方法会将文件名重复的文件保留在其原始位置(也许不错,因为您可以查看它们并稍后mv -t
将其复制到目标文件),因为在使用输入重定向时,该文件将无法交互工作。那是因为xargs
已经从重定向的标准输入(是的输出find
)中读取值,并且mv
由运行的xargs
,也尝试从相同的标准输入中读取答案。因此,您不能以交互方式将mv与管道一起使用。
也许可以通过一些巧妙的输入句柄重新分配来解决工作,但是让我们尝试更简单的方法:摆脱输出重定向。同样,我们不能-print0
在命令替换中使用它,因为它不允许使用0字节。我们需要使用for
,使用newline作为输入字段分隔符来遍历文件名:
TMP=$IFS;
IFS=$'\n';
for i in $(find Pictures -type f); do
mv -it ../Picturesnew $i;
done;
IFS=$TMP
(您可以将其复制为单线)。
在这种情况下,mv不仅会要求您提供每个重复项,还要等待答案。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句