繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM