使用Linux将特定数量的文件从一个目录复制到另一个目录

3

我有一个包含8000多个fits文件的目录,我想知道是否有一种方法可以将它们的增量复制到其他目录中,这样我就可以拥有大约1000个fits文件的8个目录或2000个fits文件的4个目录。


这些文件名中是否有任何模式可以将它们拆分?否则,您可以循环遍历文件列表,并移动到“dir_$i”,其中$i是一个在超过1000阈值时递增的变量。 - undefined
所有的fits文件都以"spec"开头。(spec-234-223-23.fits,spec-113-23-21.fits等等)。 - undefined
4个回答

4
这样的东西可以实现:
dir=1
counter=1

for file in spec*
do
   echo "cp $file dir_$dir"
   ((counter++))
   (( $counter%1000 == 1 )) && ((dir++))
done

解释

  • dir=1counter=1设置变量。
  • for file in spec*循环通过spec*模式名称文件。
  • echo "cp $file dir_$dir"将输出类似于cp spec123 dir_1/ dir_2,...我使用echo以便您在继续执行正确的cp之前检查行为。
  • ((counter++))增加counter变量的计数器。
  • (( $counter%1000 == 1 )) && ((dir++))如果$counter处于形式1000K+1,则增加$dir的值。

我是不是应该在终端上使用那段代码?我这样做了,但是我看不到包含文件的其他目录。 - undefined
你是什么意思?要执行这个操作,你需要一些关于 shell 脚本的知识。不是因为代码难度大,而是因为你应该能够根据自己的需求进行个性化定制。 - undefined
@user1821176 注意,你可以将1000更改为你想要分组的数字。此外,创建的目录将以dir_1dir_2等命名。你可以在cp $file ...部分进行更改。还要注意,我正在使用echo命令,这样你就可以测试并查看它是否有效。然后,删除echo,只保留cp $file dir_$dir。要了解如何执行它,请参考suenda的答案。 - undefined

1
为了按照你的需求扩展fedorqui编写的脚本,你可以执行以下操作:
创建一个文件, $ nano mycopy.sh (你可以选择自己的名称)
粘贴以下内容并保存文件:
source=$1
dir=1
counter=1

mkdir dir_$dir
for file in `ls $source`
do
   cp -r $source$file dir_$dir/
   ((counter++))
   (( $counter%1000 == 1 )) && ((dir++)) && ((`mkdir dir_$dir`))
done

将您的文件设为可执行状态,方法如下:
$ chmod u+x mycopy.sh

现在通过运行脚本来执行它。
$ ./mycopy.sh MyDirectoryWithManyFiles/

其中MyDirectoryWithManyFiles/是包含您文件的目录

该脚本将创建子目录并将最多1000个文件复制到其中


0

希望它能对你有所帮助!

在这里,rootfile 文件夹包含多个文件,这些文件名包含像 ..om500....om501....om502.. 这样的名称。

因此,我想将每个文件名的特定数字复制到rootfile文件夹内的新文件夹rootrate中。

#!/bin/bash
mkdir rootfile/rootrate
for ((j=500;j<503;j++)); do
echo $j
file=(`ls rootfile/*om${j}_*.root`)
if [ "$j"  -eq "500" ];
then
  max=60
fi
if [ "$j"  -eq "501" ];
then
  max=8  
fi
if [ "$j"  -eq "502" ];
then
  max=120
fi

for ((i = 0; i<max ; i++)); do
  echo "${file[i]}"
  echo $i
  cp "${file[i]}" rootfile/rootrate/ 
done
done

0
这是在Python中的一种做法:
创建一个名为"manage_files.py"的新文件,或者其他什么名字,把这段代码放进去:
# Hat-tip to https://dev59.com/XG865IYBdhLWcg3wIrFg
import os
import glob
from subprocess import call

# Initialise
my_dir = 'files_are_here'
num_files = 10

# Get a list of all files in my_dir
os.chdir(my_dir)
all_files = glob.glob('*')

for i in range((len(all_files) / num_files) + 1):
    files = all_files[i * num_files:(i + 1) * num_files]
    dirname = "dir_%s" % i
    call(["mkdir", dirname])
    file_names = ' '.join(files)
    arg = ['mv', '-t', '%s/' % dirname]
    arg.extend(files)
    call(arg)

然后,在Linux Shell中输入python manage_files.py,魔术将完成其工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接