bash - 这个文件重命名循环有什么问题?

标签 bash loops redirect pipe

我正在尝试迭代目录中的所有文件,并使用下面的命令将它们从前缀 ABC 重命名为 XYZ

while read file; do mv \"$file\" \"$(echo $file | sed -e s/ABC/XYZ/g)\" ; done < <(ls -1)

当我在 mv 前面抛出一个 echo 时,一切看起来都应该正常工作,并且复制/粘贴输出的命令可以正常工作,但它不会在循环上下文中正确执行给我一个使用错误,就好像命令格式错误,如下所示。

usage: mv [-f | -i | -n] [-v] source target
       mv [-f | -i | -n] [-v] source ... directory

即使通过 echo 检查输出的命令给出

mv "ABC Test1" "XYZ Test1"

这应该是一个有效的命令,并且如果我复制粘贴就可以工作。

知道发生了什么吗?

最佳答案

更换:

while read file; do mv \"$file\" \"$(echo $file | sed -e s/ABC/XYZ/g)\" ; done < <(ls -1)

与:

for file in *
do
    mv "$file" "${file//ABC/XYZ}"
done

注释:

  1. 这非常重要:Never parse ls . ls只是为了产生人性化的输出而设计的。

  2. 要迭代目录中的所有文件,请使用 for file in *; do ...; done 。这对于所有文件名都可靠,包括带有换行符、空格或其他困难字符的文件名。

  3. \"产生文字字符,而不是语法字符。因为我们想要 " 的语法含义在这里,我们不对其进行转义。

  4. 有时人们需要 sed但这不是其中之一。 shell 能够进行简单的替换,而不会出现与命令替换相关的所有问题。因此,$(echo $file | sed -e s/ABC/XYZ/g)可以替换为${file//ABC/XYZ} .

    表格${var//old/new}称为模式替换,并记录在man bash中.

关于bash - 这个文件重命名循环有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49215853/

相关文章:

linux - 如何使用 linux 别名 cd 进入文件夹?

linux - 从 pgrep grunt 中杀死 PID 的 bash 脚本

c++ - MinGW 下 windows 中的 Protobuf

javascript - 这个 JavaScript 随机数生成器是如何工作的?

php - Symfony,重定向到(或呈现)带有 404 状态返回码的 404 自定义错误页面

ruby-on-rails - 为什么我的 Rails 应用程序中会出现使用 force_ssl 的无限重定向循环?

linux - $'\n' 在 bash 中是什么意思?

Python:迭代元组时是否保留顺序?

循环内的 JavaScript 闭包——简单实用的例子

jsp - 如何将Servlet重定向到给定的URL