如何在具有特定编号的目录中查找具有特定模式的文件? Linux的

时间:2015-10-19 03:25:09

标签: linux bash shell

我的文件夹名为folder1,一直到文件夹150,可能超出..但我只想在某些文件夹中找到文本文件的完整路径(例如folder1到folder50)。

我认为以下命令可能有效,但不正确。

find '/path/to/directory/folder{1..50}' -name '*.txt'

解决方案不必使用find,只要它能做正确的事情。

3 个答案:

答案 0 :(得分:2)

find /path/to/directory/folder{1..50} -name '*.txt'  2>/dev/null 

或只有基本名称

find /path/to/directory/folder{1..50} -name '*.txt' -exec basename {} \; 2>/dev/null

或没有.txt的基本名称

 find /path/to/directory/folder{1..50} -name '*.txt' -exec basename {} .txt \; 2>/dev/null

答案 1 :(得分:2)

V. Michel's answer直接解决了你的问题;用解释补充它

Bash的brace expansion仅适用于未加引号的字符串;您的解决方案尝试使用单引号字符串,其内容按定义解释为 literals

对比以下两个陈述:

# WRONG:
# {...} inside a single-quoted (or double-quoted) string: interpreted as *literal*.
echo 'folder{1..3}' # -> 'folder{1..3}'

# OK:
# Unquoted use of {...} -> *brace expansion* is applied.
echo 'folder'{1..3} # -> 'folder1 folder2 folder 3'

注意上面第二个例子中只有大括号表达式不加引号,这表明你可以在Bash中有选择地混合带引号和不带引号的子串。

值得注意的是,它是 - 并且只能 - Bash 在此处执行大括号扩展,而find只能看到生成的文字路径 [1]

find仅接受 literal 路径作为文件名操作数 (某些find的初选(测试),例如-name-path,确实支持 globs (如问题中所示),但不支持扩展;为了确保这些glob完整地传递到find,而没有Bash的过早扩展,它们必须引用;例如,-name '*.txt'

[1]在Bash执行大括号扩展后, globbing (路径名扩展)可能会另外发生 ,如ehaymore's answer所示; folder(?,[1-4]?,50)括号扩展为令牌folder?folder[1-4]?folder50,由于包含模式元字符(?,其中前两个会受到全局操作的影响},[...])。无论是否涉及globbing,目标程序最终只能看到生成的文字路径。

答案 2 :(得分:1)

您可以为find命令提供多个目录,每个匹配您正在寻找的模式的一部分。例如,

find /path/to/directory/folder{?,[1-4]?,50} -name '*.txt'

扩展为三种模式:

  • 文件夹? (匹配0-9)
  • 夹[1-4]? (匹配10-49)
  • folder50

问号是单字符通配符。