如何使用 bash 脚本删除文件、目录和子目录中的前导或尾随空格?

问题描述 投票:0回答:3

在 mac OS X 上,如何让 bash 脚本能够更改当前工作目录中的 1,000 个文件和子目录以及许多子子目录。

尝试使用在目录中递归查找和替换文件名答案中的脚本,但是,这没有考虑具有前导或尾随空格的文件名或目录,因为需要转义空格。然而,正如您所看到的下面的行,路径也被转义并且脚本不起作用。

find . -name '* ' -type d -exec bash -c 'echo mv "$1"/ \""${1/ /}\""' -- {} \;



(注意:是的,我正在使用 echo 来查看命令。)

bash 脚本需要修剪文件和目录的前导和尾随空格。我所说的“修剪”是指删除前导和尾随空格,并仅保留单词之间的空格。

结构示例:

./ ./ Leading Space/ ./ Leading Space/ Text File With Leading Space.txt ./Trailing Space / ./Trailing Space / Multiple Trailing and Leading Spaces / ./Trailing Space / Multiple Trailing and Leading Spaces / Trailing and Leading Spaces Text File .txt

注意:答案需要在任何默认的 mac OS X 上工作。我不会接受使用第三方应用程序或插件的答案,包括 Mac Automator 和 perl

rename

bash macos
3个回答
1
投票
要从目录和文件中删除尾随空格:

find . -depth -name '* ' -execdir bash -c 'mv "$1" "${1%"${1##*[^[:space:]]}"}"' Move {} \;

要删除前导空格:

find . -depth -name ' *' -execdir bash -c 'f=${1#./}; mv "./$f" "./${f#"${f%%[![:space:]]*}"}"' Move {} \;

备注:

  1. 为了让 find 在目录中搜索时不会重命名目录,我们需要指定

    -depth

  2. shell 扩展 ${1%"${1##*[^[:space:]]}"}

     删除尾随空白,而 
    ${f#"${f%%[![:space:]]*}"}
     删除前导空白。

  3. bash -c

    的第一个非选项参数被分配给
    $0
    ,并在发生任何错误时用作错误消息中的程序名称。  最好在此处使用描述性名称,如上所示的 
    Move

以上是在Linux下测试的。


1
投票
您可以使用一个简单的 for 循环,并用下划线替换空格,如下所示:

for FILE in *\ * do mv "$FILE" "${FILE// /_}" done

对于多个子目录,你可以使用这样的东西:

for FILE in ./* */* */* *; do mv "$FILE" "${FILE// /_}"; done 2>/dev/null
    

0
投票
使用这个Python脚本:

https://igit.architektur.tu-darmstadt.de/pool/macsanitize

它将删除前导和尾随空格以及其他字符,以便与 samba 共享兼容。

© www.soinside.com 2019 - 2024. All rights reserved.