gpt4 book ai didi

Linux,用 bash 'no such file or directory' 错误重命名文件

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:26:59 25 4
gpt4 key购买 nike

我正在尝试为当前目录和所有子目录中不是 .sh 文件的所有文件添加前缀,使用 bash 使用 find

问题是我得到一个错误:

mv: cannot move './test.txt' to 'PRE_./test.txt': No such file or directory

我的一句话是:

find -type f ! -name "*.sh" -exec sh -c 'mv "{}" PRE_"{}"' _ {} \;

我也尝试了 xargsrename:

find -type f ! -name "*.sh" -print0 | xargs -0 rename 's/(.*)$/PRE_$1/'

但是我得到了同样的错误。怎么了?提前致谢!

最佳答案

find 返回从 . 一直到文件的路径,因此每个 find 结果都以 ./ 当您开始在当前目录中搜索时。因此,您的新文件名为 PRE_./test.txt,即名为 PRE_. 的目录中的 test.txt。由于没有名为 PRE_. 的目录,mv 无法将 test.txt 移动到该目录中,因此会显示您看到的错误消息.

如果您只是重命名当前目录中的文件,而不是子目录中的文件,您可以只使用 bash:

shopt -s extglob 
for f in !(*.sh) ; do [[ -d "$f" ]] || mv "$f" "PRE_$f" ; done

感谢this answer对于 bash 中的 !(pattern) 构造,在启用 extglob 时可用。它返回所有匹配模式的文件名。

对于所有子目录中的文件,也使用:

shopt -s extglob globstar
for f in **/!(*.sh) ; do [[ -d "$f" ]] || mv "$f" "${f%/*}/PRE_${f##*/}" ; done

感谢this answer对于全局之星。 %## 截断路径组件并将 PRE_ 粘贴到文件名开头的正确位置。

编辑 上面两个中的[[ -d "$f"]] || 防止循环重命名目录。

关于Linux,用 bash 'no such file or directory' 错误重命名文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39411951/

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