根据目录名称重命名目录中的文件

根据目录名称重命名目录中的文件

我正在尝试根据 Linux、SSH 中的目录名称重命名一堆文件。

我有一个名为 的目录XYZ01smith。其中有四个名为 的文件smith_5*。我需要XYZ01为这些文件添加前缀。
,下一个目录称为XYZ02perry。其中有四个名为perry_3*.我需要XYZ02为这些文件添加前缀。

我有一个循环来为每个目录执行此操作:

for i in smith_5*;
    do mv ${i} XYZ01${i};
done 

但我有 50 个目录 (XYZ01nameXYZ50name),所以我宁愿能够使用一个脚本来处理所有 50 个目录。我确信这应该是可能的,但我不知道如何实现。

答案1

zsh

autoload zmv # best in ~/.zshrc
zmv '(XYZ??)(*)/(*)' '$1$2/$1$3'

答案2

bash

for f in XYZ*/*; do mv -v "$f" "${f%/*}/${f:0:5}${f##*/}"; done

循环for遍历所有XYZ*目录。然后该mv命令将重命名文件。

在哪里:

  • $f是原始文件名
  • ${f%/*}是目录名
  • ${f:0:5}是前缀
  • ${f##*/}是原始文件名

答案3

您可以运行此命令,它只会向您展示它将执行的操作:

ls -d XYZ*/* |
sed -n s'|\(XYZ[0-9][0-9]\)\([^/]*\)/\(\2_.*\)|mv & \1\2/\1\3|p' |
cat

如果您希望运行命令,请将其替换catsh.

相关内容