我的文件夹名为folder1,一直到文件夹150,可能超出..但我只想在某些文件夹中找到文本文件的完整路径(例如folder1到folder50)。
我认为以下命令可能有效,但不正确。
find '/path/to/directory/folder{1..50}' -name '*.txt'
解决方案不必使用find,只要它能做正确的事情。
答案 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'
扩展为三种模式:
问号是单字符通配符。