![用于递归取消隐藏文件夹中具有特定扩展名的文件的脚本](https://linux22.com/image/825847/%E7%94%A8%E4%BA%8E%E9%80%92%E5%BD%92%E5%8F%96%E6%B6%88%E9%9A%90%E8%97%8F%E6%96%87%E4%BB%B6%E5%A4%B9%E4%B8%AD%E5%85%B7%E6%9C%89%E7%89%B9%E5%AE%9A%E6%89%A9%E5%B1%95%E5%90%8D%E7%9A%84%E6%96%87%E4%BB%B6%E7%9A%84%E8%84%9A%E6%9C%AC.png)
我有这个文件夹,其中包含许多文件夹,每个文件夹包含许多具有名称结构 .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 试运行替换规则,以向您展示这些文件将被重命名为什么。如果您对结果满意,请删除该参数,以便它真正重命名文件