我在子文件夹中有大量文件需要重命名。例如,我有:
ParentFolder/sub-Folders/*.jpg
如何使用新的命名约定复制文件,如下所示?
ParentFolder1.jpg
ParentFolder2.jpg
答案 0 :(得分:4)
执行此操作的一种方法是通过GNU parallel。教程here:
find ./ParentFolder -name "*.jpg" | parallel "mv {} DESTINATION/ParentFolder{#}.jpg"
要在执行命令之前查看要运行的命令,请尝试:
find ./ParentFolder -name "*.jpg" | parallel --dryrun "mv {} DESTINATION/ParentFolder{#}.jpg"
答案 1 :(得分:1)
使用文件globbing在整个路径上重命名:
*/*
如果您不理解,可以使用以下方法进行测试:
echo */*
第一个*是您的目录,第二个*是您的文件名。用正则表达式抓住它们:
(.*)/(.*)
现在$ 1是您的父文件夹名称,$ 2是您的文件名。您可以轻松地构建您的解决方案:
rename -n "s/(.*)\/(.*)/\$1\/\$1\$2/" */*
它保留目录结构并添加目录名作为其每个文件的前缀。只需将\$1\/\$1\$2
更改为\$1\$2
即可移动文件。然后,您只需使用rmdir删除空目录。
我自愿添加了选项-n,因此如果你复制粘贴,你就不会弄得一团糟。当您认为它很好时,只需删除该选项。
adrien@adrienLT:~/Documents/PEV$ cp -r Holiday/ Holiday_copy/
adrien@adrienLT:~/Documents/PEV$ tree Holiday*
Holiday
├── France
│ ├── 1.jpg
│ ├── 2.jpg
│ └── 3.jpg
├── Italy1
│ ├── 1.jpg
│ ├── 2.jpg
│ └── 3.jpg
└── Italy2
├── 1.jpg
├── 2.jpg
└── 3.jpg
Holiday_copy
├── France
│ ├── 1.jpg
│ ├── 2.jpg
│ └── 3.jpg
├── Italy1
│ ├── 1.jpg
│ ├── 2.jpg
│ └── 3.jpg
└── Italy2
├── 1.jpg
├── 2.jpg
└── 3.jpg
6 directories, 18 files
adrien@adrienLT:~/Documents/PEV$ cd Holiday_copy/
adrien@adrienLT:~/Documents/PEV/Holiday_copy$ rename "s/(.*)\/(.*)/\$1\/\$1\$2/" */*
adrien@adrienLT:~/Documents/PEV/Holiday_copy$ tree .
.
├── France
│ ├── France1.jpg
│ ├── France2.jpg
│ └── France3.jpg
├── Italy1
│ ├── Italy11.jpg
│ ├── Italy12.jpg
│ └── Italy13.jpg
└── Italy2
├── Italy21.jpg
├── Italy22.jpg
└── Italy23.jpg
3 directories, 9 files