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

时间:2017-06-12 01:56:40

标签: linux bash

我有一个tar文件,解压缩后,有许多文件命名为

a
b\c
d\e\f
g\h

我想将其名称更正为

等子目录中的文件
a
b/c
d/e/f
g/h

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

2 个答案:

答案 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
  • 在dir 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

(编辑:正确处理带空格的文件名)