重命名目录层次结构

重命名目录层次结构

如何重命名目录层次结构?

例如,我想重命名c/dx/y 不需要只有 2 个文件夹。

所以操作后就/a/b/c/d/e变成了完整的目录路径。/a/b/x/y/e

不知道如何用纯 bash 来实现它(我假设创建这样的 bash 脚本将花费比手动重命名更多的时间。我有大约 200 个这样的目录)

也许有一个用于此目的的实用程序?

答案1

通过组合mkdir -pmv这很容易做到。困难的部分(与 shell 一样)是以安全的方式提供有关可能被 shell 误解的特殊符号的名称。

假设我们可以保证路径不能包含\tand \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 {} \;来删除它们。

相关内容