列出文件及其基目录

发布于 2024-11-08 11:41:55 字数 381 浏览 0 评论 0原文

我的文件夹 /home/sample/* * /*.pdf 和 *.doc 和 * .xls 等中有一些文件(“**”表示某些子子目录。

我需要 shell 脚本或 linux 命令来列出pdf_docs

pdf_docs/xx.pdf  
documents/xx.doc  
excel/xx.xls  

、documents 和 excel 是目录,位于 /home/sample 中的不同深度。

/home/sample/12091/pdf_docs/xx.pdf  
/home/sample/documents/xx.doc  
/home/excel/V2hm/1001/excel/xx.xls

I have some files in my folder /home/sample/* * /*.pdf and *.doc and * .xls etc ('**' means some sub-sub directory.

I need the shell script or linux command to list the files in following manner.

pdf_docs/xx.pdf  
documents/xx.doc  
excel/xx.xls  

pdf_docs, documents and excel are directories, which is located in various depth in /home/sample. like

/home/sample/12091/pdf_docs/xx.pdf  
/home/sample/documents/xx.doc  
/home/excel/V2hm/1001/excel/xx.xls

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

禾厶谷欠 2024-11-15 11:41:55

你可以尝试这个:

for i in {*.pdf,*.doc,*.xls}; do find /home/sample/ -name "$i"; done | awk -F/ '{print $(NF-1) "/" $NF}'

我添加了一行 awk ,它将单独打印结果的最后 2 个字段(由 '/' 分隔)

You can try this:

for i in {*.pdf,*.doc,*.xls}; do find /home/sample/ -name "$i"; done | awk -F/ '{print $(NF-1) "/" $NF}'

I ve added a line of awk which will print the last 2 fields (seperated by '/' ) of the result alone

半窗疏影 2024-11-15 11:41:55

像这样的东西吗?

for i in {*.pdf,*.doc,*.xls}; do
    find /home/sample/ -name "$i";
done | perl -lnwe '/([^\/]+\/[^\/]+)$/&&print $1'

Something like this?

for i in {*.pdf,*.doc,*.xls}; do
    find /home/sample/ -name "$i";
done | perl -lnwe '/([^\/]+\/[^\/]+)$/&&print $1'
热鲨 2024-11-15 11:41:55

这个怎么样?

find /home/sample -type f -regex '^.*\.\(pdf\|doc\|xls\)

How about this?

find /home/sample -type f -regex '^.*\.\(pdf\|doc\|xls\)

海未深 2024-11-15 11:41:55

考虑文件名中的空格、扩展名的潜在情况

for a in {*.pdf,*.doc,*.xls}; do find /home/sample/ -type f -iname "$a" -exec basename {} \; ; done

编辑
编辑以仅考虑文件

Takes into account spaces in file names, potential case of extension

for a in {*.pdf,*.doc,*.xls}; do find /home/sample/ -type f -iname "$a" -exec basename {} \; ; done

EDIT
Edited to take into account only files

七色彩虹 2024-11-15 11:41:55

您不需要像您正在寻找的那样调用外部程序来截断路径名:

$ filename=/home/sample/12091/pdf_docs/xx.pdf
$ echo ${filename%/*/*}
/home/sample/12091
$ echo ${filename#${filename%/*/*}?}
pdf_docs/xx.pdf

所以,

find /home/sample -name \*.doc -o -name \*.pdf -o -name \*.xls -print0 |
while read -r -d '' pathname; do
  echo "${pathname#${pathname%/*/*}?}"
done

You don't need to call out to an external program to chop the pathname like you're looking for:

$ filename=/home/sample/12091/pdf_docs/xx.pdf
$ echo ${filename%/*/*}
/home/sample/12091
$ echo ${filename#${filename%/*/*}?}
pdf_docs/xx.pdf

So,

find /home/sample -name \*.doc -o -name \*.pdf -o -name \*.xls -print0 |
while read -r -d '' pathname; do
  echo "${pathname#${pathname%/*/*}?}"
done
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文