gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 09:50:25 24 4
gpt4 key购买 nike

我正在尝试遍历目录中的所有文件,并使用以下命令将它们从前缀 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 *;做 ...;完成。这将可靠地处理所有文件名,包括带有换行符、空格或其他困难字符的文件名。

  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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com