【问题标题】:bash script to create folders and move files用于创建文件夹和移动文件的 bash 脚本
【发布时间】:2017-02-01 11:47:15
【问题描述】:

我有许多通过模拟创建的文件。
像这样:res_00001.root 到 res_09999.root。

我想创建一系列文件夹,根据我们要移动的文件名,按顺序将 1000 个文件批量移动到新创建的文件夹中。例如folder1 将包含 res_00001.root 到 res_00999.root,folder2 res_01000.root 到 res_01999.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`

我一直在努力解决这个问题,感谢您提供的任何帮助。

【问题讨论】:

  • 请向我们准确展示您尝试过的内容,而不是指向您的阅读材料的链接
  • SO 不是代码编写服务,请提供错误/无效的代码,以便我们帮助您解决。
  • #!/bin/bash N_files=$1 for (( file=0; file&lt;$N_files; ++file )) do #state what file I am looking at s=i%1000 INPUT=printf data/output_%04lu.root $file` OUTPUT=printf data/folder%02lu/res_%04lu.root $s # 移动文件 mv INPUT OUTPUT done`
  • 抱歉,格式错误。
  • 您可能需要编辑答案并将代码 (MWE) 放在那里。

标签: linux bash shell


【解决方案1】:

更新答案

如果找不到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" 构建输出文件名

【讨论】:

  • 谢谢。我在终端上将其作为单线运行,但我没有看到任何地方生成任何文件夹。如果我在 ../../data 中,我希望看到 data/folder1、data/folder2 等。它在没有注释的情况下运行,但没有生成文件夹。我确实删除了 --dry-run
  • 我还应该提到我在 Centos7 上运行,看起来我已经使用选项 -v 详细、-s 符号链接、-h 帮助、-V 版本重命名(1)。我没有 -n 用于试运行。我没有 sudo。
  • 您可以使用mkdir folder{1..10} 将目录预先设置为您自己。不确定哪个软件包 rename 出现在 Centos 上——也许是 moreutils。它只是一个 Perl 脚本。
  • 有时称为prename ... Perl 重命名。
  • 前名不存在。它不喜欢这个命令,但它在这台机器上没有做任何事情。我创建了文件夹 1、文件夹 2、.. 我运行它的文件子集是 res_5000.root(填充更改,所以我更新了 s/[^0-8]//g),它应该进入我创建的文件夹 6。跨度>
猜你喜欢
  • 2018-05-29
  • 1970-01-01
  • 2015-11-15
  • 2014-08-05
  • 1970-01-01
  • 2021-12-26
  • 2022-01-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多