如何从目录名称中删除回车符?

Joh*_*n C 6 filenames rename

我在 Excel 中创建了一个文件并将该文件通过 ftp 传输到我的 Linux 机器上。文件中有一堆mkdir命令。现在所有新创建的目录的末尾都有一个回车符。我可以使用以下命令找到目录:

find . -type d -name *$'\r'
Run Code Online (Sandbox Code Playgroud)

但是当我尝试使用此命令删除它们时:

find . -type d -name *$'\r' | xargs rm-rf
Run Code Online (Sandbox Code Playgroud)

它不起作用 - 没有任何东西被删除。目录仍然存在,并且它们仍然有回车符。

你能帮我创建一个命令来删除那些讨厌的 '\r's 吗?谢谢。

PS 我使用的是 RHEL 5.3

Gil*_*il' 6

Linux 的rename命令使这变得简单:

rename $'\r' '' *
Run Code Online (Sandbox Code Playgroud)

这会将当前目录中所有文件名中的第一个也是唯一一个回车符 ( $'\r')替换为空字符串 ( '')。不包含回车的名称保持不变(或者您可以写入rename $'\r' '' *$'\r'只考虑必须重命名的文件)。

如果您还需要对子目录中的文件进行操作:

shopt -s globstar
rename $'\r' '' **/*$'\r'
Run Code Online (Sandbox Code Playgroud)

(Debian、Ubuntu 及其衍生产品的用户:更改renamerename.ul,或更改rename $'\r' ''rename 's/\r//'。)

替代方案,使用 zsh 的zmv功能:

zmv $'**/*\r' "${f%?}"
Run Code Online (Sandbox Code Playgroud)


h3r*_*ler 3

编辑:忘记双重转义行中的 \ sedr

其中任何一个都适合你

for i in $(find . -type d -name '*\r'); do mv "$i" "$(echo $i | sed -e 's/\\r//g')"; done

find . -type d -name '*\r' -exec mv "{}" "$(echo {} | sed -e 's/\\r//g')" \;
Run Code Online (Sandbox Code Playgroud)

这将找到当前目录下名为 *$\r 的所有目录

然后它会将mv它们(重命名)为相同的名称减去 \r