2016-09-23 133 views
0

我有很多从仿真创建的文件。
像这样:res_00001.root through res_09999.root。bash脚本创建文件夹和移动文件

我想要创建一系列文件夹,将1000个文件的批次按顺序移动到基于我们正在移动的文件名的新创建的文件夹中。例如文件夹1将包含res_00001.root通过res_00999.root,通过res_01999.root文件夹2 res_01000.root,...

我试图创建一个脚本,但它不工作:

#!/bin/bash 
N_files=$1 
for ((file=0; file<$N_files; ++file)) do #state what file I am looking at 
    s=file%1000 INPUT=printf data/output_%04lu.root $file` OUTPUT=printf data/folder%02lu/res_%04lu.root $s # move the files 
    mv INPUT OUTPUT 
done` 

我一直在敲打我的头反对一段时间,我感谢您可以提供任何帮助。

+1

请告诉我们,正是你已经尝试,而不是链接您的阅读材料 – andrew

+1

SO不是一个代码打印服务,提供错误/非工作代码,因此我们可以帮助您对其进行分类。 ! – 2016-09-23 14:57:40

+0

'#/斌/庆典 N_files = $ 1 为((文件= 0;文件<$ N_files; ++文件)) 做 #state什么文件,我在看 S = I%1000 INPUT = 'printf的数据/ output_%04lu.root $ file' OUTPUT ='printf的数据/文件夹%02lu /将res_%04lu.root $ s' #移动文件 mV输入输出 done' –

回答

0

更新回答

可以运行这个脚本,如果你不能找到rename节目 - 制作备份第一!

#!/bin/bash 
shopt -s nullglob nocaseglob 
for f in *.root; do 
    n=$(tr -dc '[0-9]' <<< $f) 
    ((d=(10#$n/1000)+1)) 
    [ ! -d folder$d ] && mkdir folder$d 
    echo mv "$f" folder$d/$f 
done 

原来的答案

做一个备份,看看这可以帮助你在你的文件的一小部分的副本:

rename --dry-run 's/[^0-9]//g; my $d=int($_/1000)+1; $_="folder$d/res_$_.root"' *root 

样本输出

'res_00001.root' would be renamed to 'folder1/res_00001.root' 
'res_00002.root' would be renamed to 'folder1/res_00002.root' 
'res_00003.root' would be renamed to 'folder1/res_00003.root' 
'res_00004.root' would be renamed to 'folder1/res_00004.root' 
'res_00005.root' would be renamed to 'folder1/res_00005.root' 
... 
... 
'res_00997.root' would be renamed to 'folder1/res_00997.root' 
'res_00998.root' would be renamed to 'folder1/res_00998.root' 
'res_00999.root' would be renamed to 'folder1/res_00999.root' 
'res_01000.root' would be renamed to 'folder2/res_01000.root' 
'res_01001.root' would be renamed to 'folder2/res_01001.root' 
'res_01002.root' would be renamed to 'folder2/res_01002.root' 
'res_01003.root' would be renamed to 'folder2/res_01003.root' 
... 
... 

如果它看起来不错,删除--dry-run所以它实际上做的东西,而不是只是说什么东西做!

  • s/[^0-9]//g摆脱的任何非数字的文件名
  • my $d=int($_/1000)+1计算目录名
  • $_="folder$d/res_$_.root"建立输出文件名
+0

谢谢。我把它作为终端上的一行代码运行,但我没有看到任何地方生成任何文件夹。如果我在../../data我期望看到数据/文件夹1,数据/文件夹2等。它运行时没有评论,但没有生成文件夹。我确实删除了--dry-run –

+0

我还应该提到我在Centos7上运行,看起来我已经用选项-v冗长,-s符号链接,-h帮助,-V版本重命名(1)。我没有-n的干运行。我没有sudo。 –

+0

您可以使用'mkdir文件夹{1..10}'将目录预先设置为yoursel。不知道哪个软件包'重命名'进来Centos - 也许'moreutils'。它只是一个Perl脚本。 –

相关问题