我使用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。