SSH以递归方式将所有子文件夹名称更改为特定名称

时间:2015-10-20 02:27:18

标签: ssh find exec superuser

我有文件夹的hundreads,每个文件夹下都有一个名为“thumbs”的子文件夹。我需要在每个子文件夹下用“thumb”更改“thumbs”子文件夹名称。

我试过

find . -type d -exec rename 's/^thumbs$/thumb/' {} ";"
当我在包含所有子文件夹的文件夹中时,我在shell中运行它,并且这些子文件夹中的每一个都包含需要用“thumb”重命名的“thumbs”文件夹。

好吧我跑了那个命令,shell花了很多时间思考,然后我给了一个CTRL + C停止,但我检查了当前目录下没有重命名文件夹,我不知道我是否重命名目录之外的文件夹我是的,有人可以告诉我代码的错误吗?

1 个答案:

答案 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;文件夹只有一个级别。将输出传递给sedp选项打印输入行,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以从每行中删除计数。将输出传递给sedp选项打印输入行,sed命令的其余部分查找最后出现&#34; thumb&#34;并仅将其更改为&#34; thumb&#34;。由于我们按照从最深到最浅的顺序处理排序列表,这将为mv提供正确的命令。最后,管道到xargs-n2选项告诉xargs使用管道中的两个参数,并将它们传递给mv命令。