我想以特殊方式批量复制文件 - 我需要脚本吗?

我想以特殊方式批量复制文件 - 我需要脚本吗?

我使用Linux已经有几年了,但是我对控制台不是很熟悉。我可以管理简单的复制命令,但现在我有一个超出我知识范围的要求。

我有大量目录(folder1、folder2、folder3 等)。在每个目录中都有一个同名的文件(例如file.txt)。我现在想批量复制目录中的这些文件,并使用相应目录的名称作为文件名。原始文件应保持不变。

所以...“folder1/file.txt”将被复制到“folder1/folder1.txt”。

这意味着每个目录中应该有两个内容相同的文件,其中一个文件与该目录同名。

我想我需要一个 bash 脚本来进行操作,对吗?如果是这样,这个脚本会是什么样子?

我将不胜感激任何帮助。

哈利

答案1

是的,您需要一个脚本(或使用其他程序时相当复杂的脚本)。但这不会很长,也不难理解:

#/------------------------------ for … in … : go through the list supplied after
#|                               the "in" one by one, setting the variable
#|                               specified after the "for" to each element from
#|                               the list, in turn
#| 
#|      /----------------------- original: name of variable to set to each value
#|      |
#|      |           /----------- */file.txt: the list of all "foldername/file.txt"
#|      |           |
#|  /------\    /--------\   
for original in */file.txt ; do

  folder_only="${original%/file.txt}"
  #\--------/  \-------------------/
  #    |                 |
  #    |                 \------------ become the value of "original", but cut off
  #    |                               any "/file.txt" from the end; for example:
  #    |                               "folder1/file.txt" becomes "folder1"
  #    |
  #    \------------------------------ save the result in a variable that's called
  #                                    "folder_only"

  cp -- "${original}" "${folder_only}/${folder_only}.txt"
done

或者,没有解释:

for original in */file.txt ; do
  folder_only="${original%/file.txt}"
  cp -- "${original}" "${folder_only}/${folder_only}.txt"
done

答案2

当您使用 zsh shell 而不是 bash 时,进行批量重命名或复制会容易得多,因为它带有一个非常强大的自动加载函数,称为zmv

autoload -Uz zmv # best in your ~/.zshrc
zmv -C '(folder<->)/file.txt' '$1/$1.txt'

其中folder<->匹配folder后跟任何 ASCII 十进制数字序列。*如果文件夹名称不必遵循该folder<digits>模式,则替换为 just。

相关内容