gpt4 book ai didi

bash - 如何使用 find 和 awk 提取文件名的一部分

转载 作者:行者123 更新时间:2023-12-04 18:40:49 33 4
gpt4 key购买 nike

我有这个目录结构

sample1__app
sample2__test

我要提取 sample1sample2然后做进一步的操作,但我坚持这个
find . -type d -maxdepth 1 -mindepth 1 -exec awk -d'__' '{print $0}' {}  \;

最佳答案

您的 awk命令正在尝试打开文件(在这种情况下为目录)并处理它们的内容,awk不热衷于做。

而且,无论如何,$0awk是整个输入行 - 我怀疑您想要第一个字段,即 $1 .

您真正想要的是处理目录名称本身(而不是它们的内容),您可以使用以下方法:

find . -maxdepth 1 -mindepth 1 -type d | awk -F'__' '{ sub ("^./", "", $1); print $1 }'

您只需通过管道输出 find通过 awk而不是给它目录名称作为输入文件。 sub将去掉前导 ./从输出中,然后您只需打印出该字段。

顺便说一句,您可能需要注意奇怪的边缘情况,例如带有换行符的目录名称。我已经根据您的特定数据定制了这个答案,它应该适用于更简单的边缘情况(例如其中包含空格的文件名),但换行符会导致问题。

我个人的观点是,用换行符、退格符等构造文件名的人是邪恶的,他们应该得到他们所得到的一切:-)

但是,如果您确实需要处理嵌入的换行符,您可以通过不在 find 中拆分这些文件名来实现。 -to- awk管道。为此,请创建一个使用引号正确处理一个参数的脚本(例如, proc.sh):
#!/usr/bin/env bash
bit="$1" # Get the argument.
bit="${bit#\./}" # Remove ./ at start.
bit="${bit%__*}" # Remove from last __ onward (use %% for first).
echo "[$1] [${bit}]" # Show effect.

然后从 find 中调用它本身(再次引用以确保参数不被拆分):
find . -maxdepth 1 -mindepth 1 -type d -exec ./proc.sh "{}" ';'

运行带有子目录的目录( XX 是嵌入的换行符):
dodgy__extXXwith-newline/
sample1__app/
sample2__test/

将正确处理它(注意多行 [...] 用于“狡猾”文件,并且输出已稍微重新格式化以提高可读性):
[./sample2__test]       [sample2]
[./sample1__app] [sample1]
[./dodgy__ext
with-newline] [dodgy]

关于bash - 如何使用 find 和 awk 提取文件名的一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42195336/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com