我尝试查找很多文件夹,但都没有特定的括号。它们是电影文件夹,如下所示:
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