如何剥离Unix“查找”中的前导“ ./”?


140
find . -type f -print

打印出来

./file1
./file2
./file3

任何使其打印的方法

file1
file2
file3


1
如果您-exec /path/to/myscript.sh {} 在中使用find-printf '%P\n'则无法使用。相反,我必须./通过以下方式在脚本中进行前缀p=${1#"./"}
斩首

如果您只针对单个文件执行此操作:f=`find . -name migration`; echo ${f/.\//}
masterxilo

Answers:


38

如果它们仅在当前目录中

find * -type f -print

那是你要的吗?


21
这将丢失名称以句点开头的文件。
肖恩2010年

2
不好,取决于外壳程序设置*可能不会评估为“隐藏”文件/目录-以点(。)开头的文件/目录。尝试在主目录中运行此命令,然后仅“查找-type f”并查看区别。
Ilia K. 2010年

35
一个更相关的问题是,“ *”由外壳程序评估。您实际上有一种恶意代码注入情况。创建一个名为“ --exec rm”和另一个名为“ zzzz;”的文件将是微不足道的。再见文件。
CWF

6
这是不安全的。如果文件名以破折号开头,它将被视为查找的选项,并且可能会失败,或者可能造成损坏。
戴尔·安德森

4
为什么-print需要?没有该标志的结果相同。
user13107 '16

239

在当前目录下仅查找常规文件,并打印不带“ ./”前缀的文件:

find -type f -printf '%P\n'

从人发现,-printf格式说明:

%P文件名以及在其下发现被删除的命令行参数的名称。


18
如果您的find支持版本-printf(并非全部支持),则+1好的解决方案。
托德·欧文

2
正如托德说,但更确切地说:它不是POSIX 7
西罗桑蒂利郝海东冠状病六四事件法轮功

8
是否支持,绝对比接受的答案安全。
戴尔·安德森

10
您可以使用\0代替,\n如果您想将其通过管道传输xargs -0(例如,如果文件名包含空格),例如find -type f -printf '%P\0' | xargs -0 head
seanf

1
@Quanlong,如果您在macOS上也可以使用brew install findutils;)
blockloop

58

使用sed

find . | sed "s|^\./||"

2
这是我的首选解决方案;它与POSIX兼容(几乎在任何地方都可以使用,甚至在嵌入式系统中也是如此),非常短,并且不太可能导致意外行为。这应该是公认的答案。
乔迪·布鲁雄

6
这将如何结合find -exec
Paul Wintz

find -exec sh -c "echo {} | sed 's|^\./||'" \;find -exec sh -c "sed 's|^\./||' <<< '{}'" \;
xenithorb

12

它可以更短

find * -type f

最好2> /dev/null在空目录中运行命令时忽略报告的错误。
neevek '16

2

剥离the的另一种方法./是使用cutlike:

find -type f | cut -c3-

这里可以找到进一步的解释


2

剥离./的另一种方法

find * -type d -maxdepth 0

尽管这段代码可以解决问题,但包括解释如何以及为什么解决该问题的说明,确实可以帮助提高您的帖子质量,并可能导致更多的投票。请记住,您将来会为读者回答问题,而不仅仅是现在问的人。请编辑您的答案以添加说明,并指出适用的限制和假设。
大卫·巴克

2

由于该-printf选项在OSX上不可用,因此find这是一个适用于OSX find的命令,以防万一某个人不想gnu find使用brewetc 进行安装:

find . -type f -execdir printf '%s\n' {} + 

1
不幸的是,这会剥离每个找到的文件的整个路径,包括中间子目录,而只是打印文件名本身。
PLL

1
你是对的。此解决方案仅适用于当前目录中的文件。对于嵌套文件,我们需要使用:find . -type f -exec bash -c 'for f; do echo "${f#./}"; done' {} +
anubhava
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.