列出文件及其基目录

时间:2011-05-17 05:01:24

标签: linux bash shell

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

我需要shell脚本或linux命令以下列方式列出文件。

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

pdf_docs,documents和excel是目录,位于/ home / sample中的各种深度。像

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

5 个答案:

答案 0 :(得分:3)

你可以试试这个:

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

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

答案 1 :(得分:2)

这样的东西?

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

答案 2 :(得分:0)

这个怎么样?

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

答案 3 :(得分:0)

考虑文件名中的空格,可能的扩展案例

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

修改 编辑只考虑文件

答案 4 :(得分:0)

您无需呼叫外部程序来切断您正在寻找的路径名:

$ 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