将文件移动到父目录,并在文件名前加上前一个子目录名作为前缀

将文件移动到父目录,并在文件名前加上前一个子目录名作为前缀

我有一个文件夹parentdir,其中包含许多这样的目录:

$ tree parentdir/subdir_1

parentdir/subdir_1
├── important.txt
├── important_001.txt
├── important_002.log
├── important_007.bmp
├── something
├── else.mp3
├── nothing.000
└── ignore.me

我想要的是将所有以 开头的文件移动important到父目录parentdir,然后通过在每个文件名前加上它们来自的子目录的名称来重命名它们。

例如,parentdir/subdir_1/important_001.txt应移动/重命名为parentdir/subdir_1-important_001.txt

如何才能最轻松地对大型目录执行批量移动/重命名操作?

答案1

parentdir可以使用

for f in ./*/important*; do rename -n 's#\./([^/]+)/(.*)#$1-$2#' "$f" ; done

测试后删除-n以实际移动并重命名

解释

  • s#old#new#old用。。。来代替new
  • \./([^/]+)/(.*)匹配文字./然后保存除之外的一些字符/,然后匹配/,然后保存其余的
  • $1-$2两个保存的模式被-

放弃路径分隔符将文件parentdir强制移动到

事后想法:更简单来说,在这种情况下,你可以用替换s#/#-#,从头开始省略/-./

for f in */important*; do rename -n 's#/#-#' "$f" ; done

相关内容