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下复制文件到另外一个目录并且重命名的具体操作如何?