在子文件夹树中应用脚本

在子文件夹树中应用脚本

我需要在子文件夹树中应用以下脚本,但不确定应该如何调用此脚本,以便在树中的每个子文件夹上执行它。我只需要做一次。提前致谢。

#!/bin/bash
for file in *.*
do
    [[ -d "$file" || $file =~ _[[:digit:]]{3}\. ]] && continue
    echo -n "Considering $file: " >&2

    extn="${file/*.}"
    versions=()
    keep="$file"

    # Look at matching files
    for version in "${file%.$extn}"_???."$extn"
    do
        [[ -f "$version" ]] || continue

        # Save every one. Identify the current last
        versions+=($version)
        keep="$version"
        echo -n "$version " >&2
    done
    echo "==> keep $keep" >&2

    # Delete them all except the last
    for version in "${versions[@]}"
    do
        [[ "$version" != "$keep" ]] && echo rm -f "$version"
    done
    [[ "$keep" != "$file" ]] && echo mv "$keep" "$file"
done

答案1

为上面的脚本命名,假设它名为myrename,并且位于目录 中$HOME。然后使用 find 中的 execdir 来遍历树:

find /root/of/tree -depth -type d -execdir "$HOME/myrename" \{\} \;

尝试使用 myrename 作为:

#!/bin/bash

echo "directory $1"

答案2

如果脚本必须在它应该工作的目录中启动,那么您必须先到cd那里。像这样的东西:

find -type d -exec sh -c 'cd -- "$1"; exec /path/to/script.sh' sh {} \;

(显然,更改脚本的路径。)

或者,您可以修改脚本以将目录名称作为参数,这应该像cd在脚本开头添加 a 一样简单。

#!/bin/bash
if [ "$1" ]; then
    cd -- "$1" || exit 1
fi
for file in *.*
...

首先测试是否$1为空,以便默认行为仍然在当前目录中工作(并且不会意外地cd不带参数调用:它将转到用户的$HOME)。

然后只需运行一个简单的命令find -exec,将目录名称作为脚本的参数:

find -type d -exec /path/to/script.sh {} \;

答案3

我用下面的方法测试过,效果很好

find path  -depth -type d -exec sh /tmp/l.sh {} \;

/tmp/l.sh==> Its the script path

相关内容