用于递归取消隐藏文件夹中具有特定扩展名的文件的脚本

用于递归取消隐藏文件夹中具有特定扩展名的文件的脚本

我有这个文件夹,其中包含许多文件夹,每个文件夹包含许多具有名称结构 .XYZ.zip 的文件。

我想将它们重命名(使用 bash)为 XYZ.zip(即取消隐藏它们)。

我见过一个问题尝试做类似的事情,

alias deannoy='for annoyingbak in *.bak;do mv "$annoyingbak" ."$annoyingbak";done'>> ~/.bashrc && . .bashrc

但我无法设法进行更改,因此它对从当前文件夹向下的所有文件夹进行递归执行。

答案1

姐妹网站上有一个很好的答案堆栈溢出: 它说:

#!/bin/bash
recurse() {
 for i in "$1"/*;do
    if [ -d "$i" ];then
        echo "dir: $i"
        recurse "$i"
    elif [ -f "$i" ]; then
        echo "file: $i"
    fi
 done
}

recurse /path

或者如果你有 bash 4.0

#!/bin/bash
shopt -s globstar
for file in /path/**
do
    echo $file
done

如果这对您有用,请在 stackexchange 上向 ghostdog74 表示感谢。askubuntu 帐户也可以在那里使用。

答案2

for ... in *.bak命令仅搜索当前目录。

您希望改用find递归搜索的命令。此命令将在当前目录 ( .) 中查找以点开头的任何深度的所有 zip 文件。

find . -iname '.*.zip'

不过,删除前导点有点棘手。下面的方法似乎可行(但可能存在极端情况,买家需谨慎)。

for f in $(find -iname '.*.zip'); do f2=$(echo $f | sed -re 's/(.*)\/\.(.*)/\1\/\2/'); echo $f $f2; done

这将打印它将执行的所有操作(echo $f $f2),如果此列表看起来正确,则将其更改为mv $f $f2,它将执行重命名。

答案3

您可以使用此命令:

$ find foobar/ -type f -iname ".*" -exec rename -n 's/^(.+)\/\.(.+)$/$1\/$2/' '{}' \;

foobar/sub_dir/moresubdir/.foo bar.zip renamed as foobar/sub_dir/moresubdir/foo bar.zip
foobar/sub_dir/moresubdir/.one.zip renamed as foobar/sub_dir/moresubdir/one.zip
foobar/sub_dir/moresubdir/.two.zip renamed as foobar/sub_dir/moresubdir/two.zip
foobar/sub_dir/.one.zip renamed as foobar/sub_dir/one.zip
foobar/sub_dir/.two.zip renamed as foobar/sub_dir/two.zip
foobar/.foo bar.zip renamed as foobar/foo bar.zip
foobar/.one.zip renamed as foobar/one.zip
foobar/.two.zip renamed as foobar/two.zip

find将递归搜索所有隐藏文件,然后将它们传递给rename。该-n参数使 rename 试运行替换规则,以向您展示这些文件将被重命名为什么。如果您对结果满意,请删除该参数,以便它真正重命名文件

相关内容