ubuntu Bin/Bash脚本重命名目录文件夹的唯一名称

hivapdat  于 2023-10-17  发布在  其他
关注(0)|答案(1)|浏览(97)

我正在学习Bin/Bash中的重命名功能,我有两个目标,我想写脚本。
1.我有500个不同公司名称的唯一文件夹名称需要更新。我目前在一个Excel文档中有信息,其中A列= OldName,B列= NewName。我想运行一个脚本来引用在A列中找到的任何名称,并将其替换为同一行中匹配的B列。
1.然后在这些文件夹目录下,我必须做同样的事情。
我已经研究了ubuntu Linux虚拟机上的rename [1]函数,但我发现的常见脚本如下:

cd yourDir
find . -type d -name "*test*" | while read f; do mv $f $(echo $f | sed 's/test/demo/'); done
find . -type f -name "*test*" | while read f; do mv $f $(echo $f | sed 's/test/demo/'); done

这些类型的脚本替换“X”值与“Y”,而我想从列A和列B替换匹配特定的名称。
谢谢你,谢谢
测试了Ubuntu的Ubuntu函数如下:

cd yourDir
find . -type d -name "*test*" | while read f; do mv $f $(echo $f | sed 's/test/demo/'); done
find . -type f -name "*test*" | while read f; do mv $f $(echo $f | sed 's/test/demo/'); done

然而,这并没有完成我想做的事情,因为每个名字都是特定的。

5ktev3wc

5ktev3wc1#

您可能可以使用GNU findutils中的find、一个bash关联数组(仅限最近的bash)和一个bash函数来完成所有这些操作。
首先使用任何excel处理器(例如incsvcsvcut)从文件中提取您的旧名称和新名称,并将它们存储在关联数组中。由于您没有给予有关此excel文件的详细信息,因此让我们假设您知道如何执行此操作,并且arr[old]=new已经定义。下面假设您要分别在123中重命名目录abc。因此,我们宣布:

$ declare -A arr=(["a"]="1" ["b"]="2" ["c"]="3")

接下来,由于数组bash变量不能导出,让我们导出一个函数来重命名,并使用邪恶的eval来声明它与关联数组的内部声明:

$ eval '
foo() {
  '"$(declare -p arr)"'
  p="${1%/*}"
  d="${1##*/}"
  [[ -v arr["$d"] ]] && echo mv "$1" "$p/${arr[$d]}"
}'
$ export -f foo

最后,让我们在find上进行一个小演示:

$ mkdir -p {a..c}/{a..c}/{a..c}
$ find . -depth -type d -exec bash -c 'foo "$1"' _ {} \;
mv ./b/b/b ./b/b/2
mv ./b/b/c ./b/b/3
mv ./b/b/a ./b/b/1
mv ./b/b ./b/2
...
mv ./a/a/b ./a/a/2
mv ./a/a/c ./a/a/3
mv ./a/a/a ./a/a/1
mv ./a/a ./a/1
mv ./a ./1

如果看起来没问题,在foo的声明中删除mv命令前面的echo
注意:需要-depth才能首先重命名叶子。函数声明的引号使用了双引号和单引号的混合,它需要合并arr关联数组的声明。

相关问题