使用<代码>-execdir的回答较为简单,但仅使用<代码>find的版本,即支持<代码>-execdir,例如政府数据库,自 rel=“noreferer”以来。 POSIX只有-exec
。
如果你只想使用ash子,那就令人惊讶地trick了,因为你重新命名了<编码>限定的<<<>>>的目录。 即使你通过使用<条码>-深度条码>选择<条码>,也可确保你只将这条道路的最后部分改成<条码>-exec条码>。 The following is a trivial differences of ,one of the Bash FAQ andview OK for me:
find . -depth -name "*_*" -exec bash -c dir=${1%/*} base=${1##*/}; mv "$1" "$dir/${base//_/ }" _ {} ;
That FAQ answer has more discussion about problem of recursively naming folders which may be of interest.
<<>Update>/em>: 由于一名仲裁员相当复杂,为了解释起见,可能有必要将其拆解。 基本上,<代码>定后 指挥:
find . -depth -name "*_*" -exec bash -c [SOME-STUFF] _ {} ;
In other words, find all the directories which contain an underscore, and for each such directory, starting with the deepest, run the bash script [SOME-STUFF]
, with parameter 0 as _
(to indicate that we don t care about it) and parameter 1 as the name of the file that find found. (find
will substitute the filename for {}
after -exec
. The ;
just terminates the command that -exec
runs.)
随后,<代码>[SOME-STUFF]部分由以下部分组成:
dir=${1%/*}
... which, using parameter expansion, will remove the shortest match for /*
from the end of $1
(the filename) and set dir
to the result. Similarly, this part:
base=${1##*/}
......从<代码>1开始起,删除了<代码>*>/和<代码>底线/代码>的长度。 http://code>base>只是道路上的最后一部分。
Then the renaming is actually done by the mv
command, which is:
mv "$1" "$dir/${base//_/ }"
这再次使用参数扩展,这次使用<代码>{参数/距离/指示> syntax。 姓名($1
)改名为$dir
。 之后是<代码> 底线代码>,但每一条强调在<代码> 底线代码>上以一个空间取代。