![根据目录名称重命名目录中的文件](https://linux22.com/image/71840/%E6%A0%B9%E6%8D%AE%E7%9B%AE%E5%BD%95%E5%90%8D%E7%A7%B0%E9%87%8D%E5%91%BD%E5%90%8D%E7%9B%AE%E5%BD%95%E4%B8%AD%E7%9A%84%E6%96%87%E4%BB%B6.png)
我正在尝试根据 Linux、SSH 中的目录名称重命名一堆文件。
我有一个名为 的目录XYZ01smith
。其中有四个名为 的文件smith_5*
。我需要XYZ01
为这些文件添加前缀。
但,下一个目录称为XYZ02perry
。其中有四个名为perry_3*
.我需要XYZ02
为这些文件添加前缀。
我有一个循环来为每个目录执行此操作:
for i in smith_5*;
do mv ${i} XYZ01${i};
done
但我有 50 个目录 (XYZ01name
到XYZ50name
),所以我宁愿能够使用一个脚本来处理所有 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
如果您希望运行命令,请将其替换cat
为sh
.