怎么可能除了隐藏的'.' 来自重命名脚本的文件和目录?

Jer*_*ska 3 find shell-script recursive regular-expression rename

我有一个重命名脚本,去掉空格,每个目录和文件。它递归地执行:

#!/bin/bash

find -name "* *" -print0 | sort -rz | \
  while read -d $'\0' f; do mv -v "$f" "$(dirname "$f")/$(basename "${f// /_}")"; done
Run Code Online (Sandbox Code Playgroud)

当我在我的~目录中运行它时,脚本造成了一些意外的破坏,重命名了以下项目:

  • ./.cache/google-chrome/Default/Storage/ext/nmmhkkegccagdldgiimedpiccmgmieda/def/Code Cache
  • ./.cache/google-chrome/Default/Storage/ext/gfdkimpbcpahaombhbimeihdjnejgicl/def/Code Cache
  • ./.cache/google-chrome/Default/Code Cache

我希望我的脚本排除任何以.重命名开头的目录或文件。你会怎么写这样的剧本?是否需要为此使用正则表达式?

Kus*_*nda 5

无需过多查看管道中的其他命令,您就find可以避免进入任何具有隐藏名称的目录:

find . ! -path . -name '.*' -prune -o -name '* *' -print0 | ...
Run Code Online (Sandbox Code Playgroud)

这将从.搜索树中删除名称开头的所有目录,.目录(当前目录)除外。它也不会再找到隐藏的名字。


查看了您的其余代码后,我建议改用rename(Perl 变体):

find . ! -path . -name '.*' -prune \
    -o -type f -name '* *' -execdir rename -n -v 'tr/ /_/' {} \;
Run Code Online (Sandbox Code Playgroud)

这将搜索包含空格的文件名,然后用下划线替换其中的所有空格,同时忽略隐藏名称并且不进入隐藏目录。

rename调用该实用程序-n以阻止它实际执行任何操作(这是“试运行”)。-n当您确信它正在做正确的事情时删除。

没有rename,你会做类似的事情

find . ! -path . -name '.*' -prune \
    -o -type f -name '* *' -exec bash -c '
    for pathname do
        filename=${pathname##*/}
        echo mv "$pathname" "${pathname%/*}/${filename// /_}"
    done' bash {} +
Run Code Online (Sandbox Code Playgroud)

也就是说,调用一个bash内嵌脚本来迭代找到的名称,通过将空格更改为下划线来重命名每个名称。

echo当您确信这会做正确的事情时,请删除它。