如何将特定数量的文件移动或复制到其他目录

如何将特定数量的文件移动或复制到其他目录

我想知道如何将特定数量的文件移动或复制到另一个目录。

例如:如果目录中有 880 个文件A,并且想要从Ato 目录移动或复制 150 个文件B,以及从Ato 目录移动或复制 150-300 个文件C

我已经尝试过这个命令

$ find . -maxdepth 1 -type f | head -150 | xargs cp -t "$destdir"

但这是将 880 个文件复制到目录B

答案1

150 个文件的可能解决方案mv

mv `find ./ -maxdepth 1 -type f | head -n 150` "$destdir"

替换mvcp复制。

这是一个测试用例:

mkdir d1 d2
cd d1
touch a b c d e f g h i j k l m n o p
cd ../
mv `find ./d1 -type f | head -n 5` ./d2/

结果:

ls d1 d2
d1:
b  c  d  e  g  h  i  k  m  n  o

d2:
a  f  j  l  p

编辑:

这是一个简单的脚本,可以回答您的评论:

#!/bin/sh
# NOTE: This will ONLY WORK WITH mv.
# It will NOT work with cp.
#
# How many files to move
COUNT=150
# The dir with all the files
DIR_MASTER="/path/to/dir/with/files"
# Slave dir list - no spaces in the path or directories!!!
DIR_SLAVES="/path/to/dirB /path/to/dirC /path/to/dirD"

for d in $DIR_SLAVES
do
    echo "Moving ${COUNT} to ${d}..."
    mv `find ${DIR_MASTER} -maxdepth 1 -type f | head -n ${COUNT}` "${d}"
done

exit

注意:示例脚本尚未经过测试,但应该可以工作。

答案2

如果您的 shell 支持process substitution,那么您可以尝试以下操作:

前 150 个 feiles 将被复制到 destdir_B,接下来的 300 个将被复制到 destdir_C。其余的将保持不变。

{
   head -n 150 | xargs -t cp -t "$destdir_B"
   head -n 300 | xargs -t cp -t "$destdir_C"
} <(find . -maxdepth 1 -type f)

这伴随着无法处理外来文件名的常见警告。

当您没有 <(...) 时,您可以将查找输出保存到文件中,然后将该文件重定向到 {...}

华泰

相关内容