2

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

在每个子目录(目录日志除外)中都有一个名为 log.lammps 的相同文件

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

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

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

4

2 回答 2

0

借助 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

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

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

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

于 2012-10-09T16:03:27.797 回答
0

沿着这条线的东西应该起作用:

for f in [0-9][0-9]/log.lammps; do
  d=$(dirname ${f})
  b=$(basename ${f})
  cp ${f} logs/${b}.${d}
done
于 2012-10-09T16:04:14.440 回答