如何重命名文件名在bash中包含反斜杠?

Dan*_*Lin 3 linux bash

我有一个tar文件,解压后,有很多文件命名就好

a
b\c
d\e\f
g\h
Run Code Online (Sandbox Code Playgroud)

我想将他们的名字更正为子目录中的文件

a
b/c
d/e/f
g/h
Run Code Online (Sandbox Code Playgroud)

当变量包含反斜杠时,我遇到问题,它将更改原始文件名.我想编写一个脚本来重命名它们.

gho*_*oti 9

参数扩展是要走的路.您拥有所需的一切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
Run Code Online (Sandbox Code Playgroud)

for循环突破如下:

  • for file in *\\*; do - 选择名称中包含反斜杠的所有文件
  • target="${file//\\//}"; - 交换正斜杠的反斜杠
  • mkdir -p "${target%/*}"; - 通过从中剥离文件名来创建目标目录 $target
  • mv -v "$file" "$target"; - 将文件移动到新家
  • done - 结束循环.

我认为唯一棘手的一点是第二行:${file//\\//}是一个表达式${var//pattern/replacement},其中模式是一个转义反斜杠(\\),替换是一个正斜杠.

查看man bash并搜索"参数扩展"以了解有关此内容的更多信息.