如何重命名目录层次结构?
例如,我想重命名c/d
为x/y
不需要只有 2 个文件夹。
所以操作后就/a/b/c/d/e
变成了完整的目录路径。/a/b/x/y/e
不知道如何用纯 bash 来实现它(我假设创建这样的 bash 脚本将花费比手动重命名更多的时间。我有大约 200 个这样的目录)
也许有一个用于此目的的实用程序?
答案1
通过组合mkdir -p
,mv
这很容易做到。困难的部分(与 shell 一样)是以安全的方式提供有关可能被 shell 误解的特殊符号的名称。
假设我们可以保证路径不能包含\t
and \n
(对于 linux/unix 系统来说通常不是这样)。然后我们可以向重命名工具提供制表符分隔字段的列表:
# Prepare paths
cat > names.txt <<"HERE" # TAB separated
a/b/c/d/file1 a/b/x/y/file1
a/white space/file2 a/c/z/while space/file2
a/fancy$name/file2 a/c/z/so what?/file2
HERE
# Do the renaming
while IFS=$'\t' read -r IN OUT; do
printf 'Renaming [%s]->[%s]\n' "$IN" "$OUT"
mkdir -p "${OUT%/*}"
mv "$IN" "$OUT"
done < names.txt
注意:当然,您可以names.txt
使用您选择的文本编辑器来准备文件,而不是使用cat
其他here document
东西。
注 2:"${OUT%/*}"
语法(“删除匹配的后缀模式”)是 bash 特定的。
注意 3:旧目录不会被删除,您可以运行类似的命令find -depth -type d -empty -print -exec rmdir {} \;
来删除它们。