![](/img/trans.png)
[英]How to rename file based on parent and child folder name in bash script
[英]How to rename file name contains backslash in bash?
我有一个tar文件,解压后,有很多文件命名就好
a
b\c
d\e\f
g\h
我想将他们的名字更正为子目录中的文件
a
b/c
d/e/f
g/h
当变量包含反斜杠时,我遇到问题,它将更改原始文件名。 我想编写一个脚本来重命名它们。
参数扩展是要走的路。 你拥有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
for file in *\\\\*; do
- 选择名称中包含反斜杠的所有文件 target="${file//\\\\//}";
- 交换正斜杠的反斜杠 mkdir -p "${target%/*}";
- 通过从$target
剥离文件名来创建目标目录 mv -v "$file" "$target";
- 将文件移动到新家 done
- 结束循环。 我认为唯一棘手的问题是第二行: ${file//\\\\//}
是${var//pattern/replacement}
的表达式,其中模式是转义反斜杠( \\\\
)和替换是一个单一的正斜杠。
看看man bash
并搜索“参数扩展”以了解更多相关信息。
使用反斜杠重命名文件很简单: mv 'a\\b' 'newname'
(只是引用它),但你需要更多。
你需要:
a\\b\\c
) c
a\\b
) a/b
,dir b
dir a
) a\\b\\c
重命名为dir a/b
名为c
文件) 像这样的东西:
#!/bin/bash
find . -name '*\\*' | while read f; do
base="${f%\\*}"
file="${f##*\\}"
path="${base//\\//}"
mkdir -p "$path"
mv "$f" "$path/$file"
done
(编辑:正确处理带空格的文件名)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.