Unix-在重命名文件时将相同文件从多个目录复制到新目录

Posted

技术标签:

【中文标题】Unix-在重命名文件时将相同文件从多个目录复制到新目录【英文标题】:Unix- Copying the same file from multiple directories into a new directory while renaming the files 【发布时间】:2012-09-29 23:32:44 【问题描述】:

我在同一个目录中有 36 个子目录,名为 10,11,12,....45 和一个子目录 logs

在每个子目录中(除了目录logs)都有一个名为log.lammps的文件

我想知道是否有一种方法可以从每个子目录 10-45 复制每个 log.lammps 文件并将其放入子目录日志中,同时还将其源自的目录的编号添加到末尾文件名

所以我正在寻找一个从每个子目录一个接一个地复制文件 log.lammps 的代码,并且每次将文件复制到目录日志中时,文件名都会从 log.lammps 更改为 log.lammps10(如果它来了)从子目录 10 中,当文件 log.laamps 从子目录 11 复制到日志时,其名称更改为 log.lammps11 等。

任何帮助将不胜感激,因为现在我只处理 30-40 个文件,并且及时我将处理数百个文件

【问题讨论】:

如果某个答案对您有用,您愿意接受吗? 【参考方案1】:

沿着这条线的东西应该可以工作:

for f in [0-9][0-9]/log.lammps; do
  d=$(dirname $f)
  b=$(basename $f)
  cp $f logs/$b.$d
done

【讨论】:

【参考方案2】:

借助 shell 脚本的魔力,这很容易。我假设你有 bash 可用。在包含这些子目录的目录中创建一个新文件;将其命名为 copy_logs.sh。将以下文本复制粘贴到其中:

#!/bin/bash

# copy_logs.sh

# Copies all files named log.lammps from all subdirectories of this
# directory, except logs/, into subdirectory logs/, while appending the name
# of the originating directory.  For example, if this directory includes
# subdirectories 1/, 2/, foo/, and logs/, and each of those directories
# (except for logs/) contains a file named log.lammps, then after the
# execution of this script, the new file log.lammps.1, log.lammps.2, and
# log.lammps.foo will have been added to logs/.  NOTE: any existing files
# with those names in will be overwritten.

DIRNAMES=$( find . -type d | grep -v logs | sed 's/\.//g' | sed 's/\///g' | sort )

for dirname in $( echo $DIRNAMES )
do
    cp -f $dirname/foo.txt logs/foo$dirname
    echo "Copied file $dirname/foo.txt to logs/foo.$dirname"
done

查看脚本的 cmets 了解它的作用。保存文件后,您需要在命令行上通过命令chmod a+x copy_logs.sh 使其可执行。在此之后,您可以通过在命令行上键入./copy_logs.sh 来执行它,而您的工作目录是包含脚本和子目录的目录。如果将该目录添加到 $PATH 变量中,则无论您的工作目录是什么,都可以使用命令 copy_logs.sh

(我用 GNU bash v4.2.24 测试了脚本,所以它应该可以工作。)

有关 bash shell 脚本的更多信息,请参阅任意数量的书籍或互联网站点;你可以从Advanced Bash-Scripting Guide开始。

【讨论】:

再次查看我的代码,我注意到在分配变量DIRNAMES 时,所有包含字符串logs 的目录名称都将被删除。为了解决这个问题,可以调整脚本以仅搜索名称由数字组成的目录。但是,我不依赖目录的命名约定,而是将“日志”子目录从相关目录中移开,这样我就可以依赖所有子目录属于某种类型——在这种情况下,将包含log.lammps 文件的类型。这很有意义。

以上是关于Unix-在重命名文件时将相同文件从多个目录复制到新目录的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Linux 中批量移动复制追加和重命名文件

怎样将文件复制到opt下

在linux下复制文件到另外一个目录并且重命名的具体操作如何?

word文档在重命名时提示:源文件名和目标文件名相同。不能重命名,这是怎么回事。

如何使用 mv 命令重命名 unix 中的多个文件?

UNIX 文件管理