如何查找没有特定名称的文件夹?

如何查找没有特定名称的文件夹?

我尝试查找很多文件夹,但都没有特定的括号。它们是电影文件夹,如下所示:

Zombie Flesh Eaters (1979) [tmdb-7219]
Zombieland (2009) [tmdb-19908]
Zombieland Double Tap (2019) [tmdb-338967]

但我需要找到没有 [tmdb] 括号的那些。

我不知道该怎么做?

快速编辑: 尝试使用正则表达式\[.*?\]查找带有括号的所有内容,但我不确定它是否正常工作(我不太擅长正则表达式,但使用正则表达式测试器确认它会查找括号内的任何内容)。

但我需要找到没有括号的文件夹。我不知道该怎么做

答案1

find操作员的功能-not。告诉它在哪里搜索,要查找什么类型的项目(例如,-type d仅查找文件夹)以及名称中不应包含什么,即-not -name '*\[*\]'。因此

find /somewhere -type d -not -name '*\[*\]'

答案2

这很容易做到。

ls -Aq1 | grep -Pv '.*\[tmdb-\d+\].*'

ls一般来说,管道传输被认为是一件坏事,但是,我认为所有的文件夹都没有奇怪的名字,因为它们只是电影文件夹,所以我认为ls这里的管道传输是可以的。

我还没有测试过,但我很有信心它可以起作用。

另外,我猜你会把这些文件夹放在一个循环中,以便将 id 添加到名称中。纯粹的猜测,但我假设。那么这很方便,因为 ls 输出(因为-..1)将位于列表中。因此,你可以轻松地执行此操作来逐个处理文件夹:

ls -Aq1 | grep -Pv '.*\[tmdb-\d+\].*' | \
while read -r level
do
   ...
done

或者

ls -Aq1 | \
while read -r level
do
   if ! echo "$level" | grep -Pq '.*\[tmdb-\d+\].*'
   then
      ...
   fi
done

答案3

如果您不需要递归搜索,那么 bash shell可以使用exextglob进行否定。!(pattern)

shopt -s extglob

printf '%s\n' !(*\[tmdb-*\]*)/

extglob选项可能在交互式 bash shell 中默认启用。仅当您需要从匹配中排除纯文本文件时才需要尾随/- 相当于find命令的type -d

例如给定一个包含内容的目录

$ ls
'Zombie Flesh Eaters (1979) [something else here]'  'Zombieland (2009) [tmdb-19908]'
'Zombie Flesh Eaters (1979) [tmdb-7219]'            'Zombieland Double Tap (2019) [tmdb-338967]'
'Zombieland (2009)'

然后

$ printf '%s\n' !(*\[tmdb-*\]*)/
Zombie Flesh Eaters (1979) [something else here]/
Zombieland (2009)/

或者

$ ls -d !(*\[tmdb-*\]*)/
'Zombie Flesh Eaters (1979) [something else here]/'  'Zombieland (2009)/'

与 不同find,默认情况下这不会匹配隐藏目录(尽管您可以通过设置 来包含它们shopt -s dotglob)。

如果你需要递归搜索,您可以添加shopt -s globstar和使用,尽管在这种情况下**/!(*\[tmdb-*\]*)/我可能会选择。find

相关内容