我需要在子文件夹树中应用以下脚本,但不确定应该如何调用此脚本,以便在树中的每个子文件夹上执行它。我只需要做一次。提前致谢。
#!/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