我有一个tar文件,解压缩后,有许多文件命名为
a
b\c
d\e\f
g\h
我想将其名称更正为
等子目录中的文件a
b/c
d/e/f
g/h
当变量包含反斜杠时,我遇到问题,它会更改原始文件名。我想编写一个脚本来重命名它们。
答案 0 :(得分:8)
参数扩展是要走的路。您拥有bash
所需的一切,无需使用find
等外部工具。
$ touch a\\b c\\d\\e
$ ls -l
total 0
-rw-r--r-- 1 ghoti staff 0 11 Jun 23:13 a\b
-rw-r--r-- 1 ghoti staff 0 11 Jun 23:13 c\d\e
$ for file in *\\*; do
> target="${file//\\//}"; mkdir -p "${target%/*}"; mv -v "$file" "$target"; done
a\b -> a/b
c\d\e -> c/d/e
for循环如下:
for file in *\\*; do
- 选择名称中包含反斜杠的所有文件target="${file//\\//}";
- 交换正斜杠的反斜杠mkdir -p "${target%/*}";
- 通过从$target
mv -v "$file" "$target";
- 将文件移至新家done
- 结束循环。我认为唯一棘手的问题是第二行:${file//\\//}
是${var//pattern/replacement}
的表达式,其中模式是转义反斜杠(\\
),替换是单个正斜线。
查看man bash
并搜索“参数扩展”以了解详情。
答案 1 :(得分:2)
使用反斜杠重命名文件很简单:mv 'a\b' 'newname'
(只是引用它),但是您需要的不止这些。
你需要:
a\b\c
)a\b
来自c
)a/b
下创建完整路径(例如b
,dir a
a\b\c
重命名为dir c
中名为a/b
的文件这样的事情:
#!/bin/bash
find . -name '*\\*' | while read f; do
base="${f%\\*}"
file="${f##*\\}"
path="${base//\\//}"
mkdir -p "$path"
mv "$f" "$path/$file"
done
(编辑:正确处理带空格的文件名)