我有文件夹的hundreads,每个文件夹下都有一个名为“thumbs”的子文件夹。我需要在每个子文件夹下用“thumb”更改“thumbs”子文件夹名称。
我试过
find . -type d -exec rename 's/^thumbs$/thumb/' {} ";"
当我在包含所有子文件夹的文件夹中时,我在shell中运行它,并且这些子文件夹中的每一个都包含需要用“thumb”重命名的“thumbs”文件夹。
好吧我跑了那个命令,shell花了很多时间思考,然后我给了一个CTRL + C停止,但我检查了当前目录下没有重命名文件夹,我不知道我是否重命名目录之外的文件夹我是的,有人可以告诉我代码的错误吗?
答案 0 :(得分:0)
目标1:更改子文件夹" 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
为您提供所有&#34;拇指&#34;文件夹只有一个级别。将输出传递给sed
。 p
选项打印输入行,sed
命令的其余部分更改&#34; thumb&#34;到&#34;拇指&#34;。最后,管道到xargs
。 -n2
选项告诉xargs
使用管道中的两个参数,并将它们传递给mv
命令。
<强>问题:强>
这不会捕获更深层次的子文件夹。您不能在此处使用深度,因为find
打印顶部的输出,因为我们在sed
之前用mv
替换了内容,mv
将导致在较深的子文件夹中出错。例如,。/ foo / early / first /不会起作用,因为mv
将首先处理./foo/thumbs并使其成为./foo/thumb,但是下一个输出行将导致错误因为./foo/thumbs/thumbs/不再存在。
目标2:更改所有子文件夹&#34; thumb&#34;到&#34;拇指&#34;无论多深。
示例输入:
./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
为您提供所有&#34;拇指&#34;子文件夹。将输出传输到awk
以打印每个路径中的&#39; /&#39;以及原始输出。 sort
输出数字,反之(将最深的路径放在最上面)的数量为&#39; /&#39; s。将排序列表传送到awk
以从每行中删除计数。将输出传递给sed
。 p
选项打印输入行,sed
命令的其余部分查找最后出现&#34; thumb&#34;并仅将其更改为&#34; thumb&#34;。由于我们按照从最深到最浅的顺序处理排序列表,这将为mv
提供正确的命令。最后,管道到xargs
。 -n2
选项告诉xargs
使用管道中的两个参数,并将它们传递给mv
命令。