我需要删除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 {} +
答案 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