如何在 Unix 终端中重命名所有子文件夹中的多个目录

How to rename several directories in all subfolders In Unix terminal

我有一个名为“Experiment”的主目录,其中我保留了几个子文件夹,如“time_data”,然后几个子文件夹“bacterial_strain"and in the end "drug concentration”写成“0,5 mM”。所以最终的路径是:

/Experiment/time_data/bacterial_strain/0,5 mM

我想将所有子目录中的所有目录从“0,5 mM”重命名为“0,7 mM”

我尝试 运行 几个不同的管道,如:

find . -type d | grep 0,5 | mv "0,5 mM/" "0,7 mM/"

grep -r "0,5 mM" "/path_to_Experiment_folder" | mv 0,5\ mM 0,7\ mM

但是终端报同样的错误:

mv: rename 0,5 mM to 0,7 mM: No such file or directory

请帮帮我,如何更改管道才能做到这一点?

您可以尝试这样的操作:

find . -depth -type d -name "0,5mM*" -exec mv {} 
Experiment/time_data/bacterial_strain/drug_concentration/0,7mM \;

注意事项:

  1. 我注意到您的最后一个子文件夹名称包含 space 0,5 mM。使用 space 的 find 命令和使用 space 执行 -exec mv 对我不起作用。我不确定为什么。出于测试目的,我删除了 space 字符并且上面的命令有效,它也是一个类似的命令,我只是为了可见性而将其分开,我相信这会被弄清楚,但是 ;).
  2. 我已经用整个路径重命名了最后一个文件0,5mM。我假设你所有的目录深度都是相同的,如果不是那么你可以进一步探索 -depth 选项。
  3. 如果你有不同的深度目录或不同的名称需要重命名,也可以将上述命令封装在一个脚本中,运行放在父目录下。

我希望这对你有用。

这应该有效:

$ find . -type d -name 0,5\ mM -print | while read dir ; do mv -v "${dir}" "${dir/0,5/0,7}" ; done

另一种方式是:

for f in Experiment/*/*/0,5\ mM; do nf=$(dirname "$f")/0,7\ mM; mv "$f" "$nf"; done

或(如果您还有名称为“0,5 mM”但不想重命名的文件):

for f in Experiment/*/*/0,5\ mM; do if [ -d "$f" ]; then nf=$(dirname "$f")/0,7\ mM; mv "$f" "$nf"; fi; done

Here您可以找到其他方法。