我有这样的目录结构。
.
├── Round_1_Div2
│ ├── file1.txt
│ └── file2.txt
├── Round1Div2
│ ├── file3.txt
│ └── file4.txt
├── Round_2_Div2
│ ├── file1.txt
│ └── file2.txt
└── Round2Div2
├── file3.txt
└── file4.txt
我需要将所有文件从第1轮第2轮到Round_1_Div2和回合2分区2到Round_2_Div2
根据我的一点知识
find *ound[0-9]Di* > rename.txt
sed -e 's/ound/ound_/;s/Di/_Di/' < rename.txt > newname.txt
重命名.txt和名字.txt运行上述命令后创建
重命名.txt
Round1Div2
Round2Div2
新名称.txt
Round_1_Div2
Round_2_Div2
如何将每个 like 中指定的目录中的所有文件移动到 of重命名.txt到对应的目录下新名称.txt??谢谢。
答案1
使用 perlrename
实用程序(也称为prename
和file-rename
):
$ rename -n 's/Round(\d)Div(\d)/Round_$1_Div$2/' */*
rename(Round1Div2/file3.txt, Round_1_Div2/file3.txt)
rename(Round1Div2/file4.txt, Round_1_Div2/file4.txt)
rename(Round2Div2/file3.txt, Round_2_Div2/file3.txt)
rename(Round2Div2/file4.txt, Round_2_Div2/file4.txt)
该-n
选项使其成为一次试运行,因此它仅显示其内容会做而不是真正去做。当您确定它将执行您想要的操作时,请删除-n
(仅重命名文件,没有任何进度显示或其他输出)或将其替换-v
为详细输出:
$ rename -v 's/Round(\d)Div(\d)/Round_$1_Div$2/' */*
Round1Div2/file3.txt renamed as Round_1_Div2/file3.txt
Round1Div2/file4.txt renamed as Round_1_Div2/file4.txt
Round2Div2/file3.txt renamed as Round_2_Div2/file3.txt
Round2Div2/file4.txt renamed as Round_2_Div2/file4.txt
答案2
使用类似的东西似乎最简单
mv -i Round1Div2/* Round_1_Div2 && rmdir Round1Div2
mv -i Round2Div2/* Round_2_Div2 && rmdir Round2Div2
如果存在名称冲突,-i
选项mv
应该会给您一个交互式提示,询问您是否要覆盖该文件。
如果您有隐藏文件名,或者数千文件,那么您可能想使用rsync
:
rsync -av --ignore-existing Round1Div2/ Round_1_Div2
rsync -av --ignore-existing Round2Div2/ Round_2_Div2
请注意,/
源目录名称末尾的 是故意的。这将在目标目录下重新创建源目录的文件层次结构,并且不会覆盖现有数据。源目录将保留在原处(所以这副本而不是移动,除非您还添加了选项--remove-source-files
)。