目标 1: 如果只有一级深度,则将子文件夹“thumbs”更改为“thumb”。
示例输入:
./foo1/thumbs
./foo2/thumbs
./foo2/thumbs
解决方案:
find . -maxdepth 2 -type d | sed 'p;s/thumbs/thumb/' | xargs -n2 mv
输出:
./foo1/thumb
./foo2/thumb
./foo2/thumb
解释:
find
用来给你所有的“拇指”文件夹只有一层深。管道输出到sed
. 该p
选项打印输入行,sed
命令的其余部分将“thumbs”更改为“thumb”。最后,管道到xargs
. 该-n2
选项告诉xargs
使用管道中的两个参数并将它们传递给mv
命令。
问题:
这不会捕获更深的子文件夹。您不能简单地在这里不使用 depth ,因为find
从顶部打印输出,并且由于我们用sed
before we替换内容mv
,mv
因此会导致更深的子文件夹出错。例如,./foo/thumbs/thumbs/ 将不起作用,因为mv
会先处理 ./foo/thumbs 并使其成为 ./foo/thumb,但接下来的输出行将导致错误,因为 ./foo/拇指/拇指/不再存在。
目标 2: 将所有子文件夹“拇指”更改为“拇指”,无论多深。
示例输入:
./foo1/thumbs
./foo2/thumbs
./foo2/thumbs/thumbs
./foo2/thumbs
解决方案:
find . -type d | awk -F'/' '{print NF, $0}' | sort -k 1 -n -r | awk '{print $2}' | sed 'p;s/\(.*\)thumbs/\1thumb/' | xargs -n2 mv
输出:
./foo1/thumb
./foo2/thumb
./foo2/thumb/thumb
./foo2/thumb
解释:
用于find
为您提供所有“拇指”子文件夹。通过管道输出到awk
以打印每个路径中“/”的数量加上原始输出。 sort
以数字方式输出,以“/”的数量反向(将最深的路径放在顶部)。将排序列表传递awk
给以删除每行的计数。管道输出到sed
. 该p
选项打印输入行,sed
命令的其余部分查找最后一次出现的“thumbs”并将其仅更改为“thumb”。由于我们正在按照从最深到最浅的顺序处理排序列表,因此这将提供mv
正确的命令。最后,管道到xargs
. 该-n2
选项告诉xargs
使用两个来自管道的参数并将它们传递给mv
命令。