将文件移动到父目录,在文件名前加上子目录名

Byt*_*der 3 command-line rename batch-rename mv

我有一个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
Run Code Online (Sandbox Code Playgroud)

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

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

我怎样才能最轻松地在一个巨大的目录上执行这个批量移动/重命名操作?

Zan*_*nna 5

parentdir你可以使用

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

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

解释

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

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

事后思考:在这种情况下更简单,您可以使用s#/#-#替换/with -./从一开始就省略

for f in */important*; do rename -n 's#/#-#' "$f" ; done
Run Code Online (Sandbox Code Playgroud)