英文:
Deleting folders across directories
问题
我有这样的目录结构:
... / firstlevel / output / sub-(101-162) / ...
在每个子文件夹 sub-XXX 中,我有 run_1、run_1.feat、run_1+.feat、run_1++.feat、run_2、run_2.feat、run_2+.feat 和 run_2++.feat 这些文件夹。
有没有一条命令可以让我保留所有子文件夹 sub-XXX 中的 run_1++.feat 和 run_2++.feat 文件夹,并删除 run_1、run_1.feat、run_1+.feat、run_2、run_2.feat、run_2+.feat?
谢谢!
英文:
I have a directory structure like this:
... / firstlevel / output / sub-(101-162) / ...
In each sub-XXX folder, I have the folders run_1, run_1.feat, run_1+.feat, run_1++.feat, run_2, run_2.feat, run_2+.feat run_2++.feat.
Is there a one-line command I can run to keep only the run_1++.feat and run_2++.feat folders for all sub-XXX folders?
In other words, for each sub-XXX folder, I want to keep the folders run_1++.feat and run_2++.feat and delete run_1, run_1.feat, run_1+.feat, run_2, run_2.feat, run_2+.feat.
Thanks!
答案1
得分: 1
正面解释
如果您想删除所有名为 run_1
、run_1.feat
、run_1.+feat
、run_2
、run_2.feat
或 run_2.+feat
的子目录(但保留 firstlevel/output/sub-101/foo/
),您可以尝试以下命令:
ls firstlevel/output/sub-{101..162}/run_{1,2}{,{,+}.feat}/
如果列表看起来正确,请将 ls
替换为 rm -rf
。注意:末尾的 /
防止删除常规文件,只会匹配目录。可能会出现目录删除列表过长导致 Argument list too long
错误的情况。在这种情况下,您可以尝试使用 find
:
find firstlevel/output/sub-{101..162} -maxdepth 1 -type d \
\( -name run_[12] -o -name run_[12].feat -o -name run_[12]+.feat \) -print
确保确定后,将 -print
替换为 -delete
。如果参数列表仍然过长,可以尝试将 101..162
范围拆分为多个较小的范围:
find firstlevel/output/sub-{101..131} -maxdepth 1 -type d \
\( -name run_[12] -o -name run_[12].feat -o -name run_[12]+.feat \) -print
find firstlevel/output/sub-{132..162} -maxdepth 1 -type d \
\( -name run_[12] -o -name run_[12].feat -o -name run_[12]+.feat \) -print
负面解释
如果您想删除所有子目录,不包括 名为 run_1++.feat
或 run_2++.feat
的目录(包括 firstlevel/output/sub-101/foo/
),您可以尝试以下命令:
( shopt -s extglob; ls firstlevel/output/sub-{101..162}/!(run_[12]++.feat)/ )
extglob
选项启用了扩展的模式匹配运算符,如 !(pattern)
,它匹配除了 pattern
之外的任何内容。在子shell(周围的括号)中运行命令列表可以限制 extglob
的作用范围。同样,如果列表看起来正确,请将 ls
替换为 rm -rf
。同样,如果列表太长,您可以尝试使用 find
:
find firstlevel/output/sub-{101..162} -maxdepth 1 -type d \
! -name run_[12]++.feat -print
确信后,将 -print
替换为 -delete
。
英文:
There are 2 possible interpretations of your question depending whether you want to delete a sub-directory that would be named firstlevel/output/sub-101/foo/
, or not.
Positive interpretation
If you want to delete all sub-directories named run_1
, run_1.feat
, run_1.+feat
, run_2
, run_2.feat
or run_2.+feat
(but keep firstlevel/output/sub-101/foo/
), you can try:
ls firstlevel/output/sub-{101..162}/run_{1,2}{,{,+}.feat}/
If the list looks correct replace ls
with rm -rf
. Note: the trailing /
prevents deletion of regular files, only directories will match. It could be that the list of directories to delete is too long and that you get an Argument list too long
error. In this case you can try find
:
find firstlevel/output/sub-{101..162} -maxdepth 1 -type d \
\( -name run_[12] -o -name run_[12].feat -o -name run_[12]+.feat \) -print
When convinced replace -print
with -delete
. If the argument list is still too long try to split the 101..162
range in several smaller ones:
find firstlevel/output/sub-{101..131} -maxdepth 1 -type d \
\( -name run_[12] -o -name run_[12].feat -o -name run_[12]+.feat \) -print
find firstlevel/output/sub-{132..162} -maxdepth 1 -type d \
\( -name run_[12] -o -name run_[12].feat -o -name run_[12]+.feat \) -print
Negative interpretation
If you want to delete all sub-directories not named run_1++.feat
or run_2++.feat
(including firstlevel/output/sub-101/foo/
), you can try:
( shopt -s extglob; ls firstlevel/output/sub-{101..162}/!(run_[12]++.feat)/ )
The extglob
option enables extended pattern matching operators, like !(pattern)
that match anything except pattern
. Running the list of commands in a subshell (the surrounding parentheses) limits the scope of extglob
. Again, if the list looks correct replace ls
with rm -rf
. And again, if the list is too long you can try find
:
find firstlevel/output/sub-{101..162} -maxdepth 1 -type d \
! -name run_[12]++.feat -print
When convinced replace -print
with -delete
.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论