删除名称长于x的目录

时间:2018-02-09 13:47:34

标签: regex linux bash

我需要删除Linux shell上名称长度超过4个字符的目录。 但不要计算子目录的长度。

例如:

/12345/..    <= Should be deleted
/123456/..   <= Should be deleted
/1234/12345  <= Should NOT be deleted
/1234/123456 <= Should NOT be deleted

更新 知道了:

find -maxdepth 1 -regextype posix-egrep -type d -regex '.*[^/]{4}' -exec rm -rf {} +

4 个答案:

答案 0 :(得分:2)

要删除bash中包含5个或更多字符的所有目录,您可以执行以下操作:

rm -rf ?????*/

表达式是不是正则表达式,而是一个使用一组wildecard字符指定文件名或路径的glob模式。

基本上,如果你想让你的目录保持4个字符或更少,你想删除5个或更多的所有内容,因此5 ?和单个*/表示目录。

  

<强> man bash

     

* ::匹配任何字符串,包括空字符串。启用globstar shell选项后,路径名中将使用*   扩展上下文,用作单个模式的两个相邻*将匹配所有文件以及零个或多个目录和子目录。如果后跟/,则两个相邻的*将仅匹配目录和   子目录。

     

? ::匹配任何单个字符。

$ find .
.
$ mkdir -p {1,12,123,1234,12345,123456}/{123,12345}
$ touch foobar
$ rm -rf ?????*/
$ find .
.
./123
./123/12345   <= subdirectory with 5 or more not deleted
./123/123
./foobar      <= the file is still here
./1234
./1234/12345
./1234/123
./12
./12/123
./12/12345
./1
./1/12345
./1/123

答案 1 :(得分:0)

为了易读,请引导至grep然后转至xargs

find . -maxdepth 1 -type d | grep '.....' | xargs rm -rf

答案 2 :(得分:0)

find -maxdepth 1 -type d -name '?????*' -delete

如果您不想将自己限制在-maxdepth 1,它也适用于更深层次的嵌套目标。

其他

rm -rf ?????*/

当然更简洁优雅。我的第一个想法,rmdir,当然只适用于空的dirs。我没有想到这一点。

使用

find -maxdepth 1 -type d -name '?????*' -ls 

发出删除选项之前,因为它是不可逆转的。如果经常使用find ... -delete,通常需要备份。 :)

答案 3 :(得分:0)

您可以-regextype使用find

$ pdirpath="/path/to/search"
$ find "$pdirpath" -type d -regextype posix-extended \
   -regex "$pdirpath/[a-z0-9]{5,}" -exec rm -rf {} \;

上面将删除

目录
/path/to/search/fooba
/path/to/search/12345
/path/to/search/foobar

/path/to/search/foobar/12345
/path/to/search/1234