我需要一个文件来报告每个文件夹的内容和文件夹本身的名称。如果我做
ls -l *
我有(这只是数百个文件夹的子集)
secondary_endosymbiont_of_Heteropsylla_cubana_Thao2000_uid172738:
total 1232
-rw-r--r-- 1 FrancescaDeFilippis staff 627404 2 Nov 2012 NC_018420.ffn
syncytium_symbiont_of_Diaphorina_citri_uid213384:
total 896
-rw-r--r-- 1 FrancescaDeFilippis staff 446934 29 Lug 2013 NC_021885.ffn
-rw-r--r-- 1 FrancescaDeFilippis staff 5594 29 Lug 2013 NC_021886.ffn
uncultured_Sulfuricurvum_RIFRC_1_uid193658:
total 4840
-rw-r--r-- 1 FrancescaDeFilippis staff 1002 9 Apr 2013 NC_020503.ffn
-rw-r--r-- 1 FrancescaDeFilippis staff 2470123 9 Apr 2013 NC_020505.ffn
uncultured_Termite_group_1_bacterium_phylotype_Rs_D17_uid59059:
total 3392
-rw-r--r-- 1 FrancescaDeFilippis staff 851852 1 Mar 2013 NC_020419.ffn
-rw-r--r-- 1 FrancescaDeFilippis staff 6684 1 Mar 2013 NC_020420.ffn
-rw-r--r-- 1 FrancescaDeFilippis staff 3869 1 Mar 2013 NC_020421.ffn
-rw-r--r-- 1 FrancescaDeFilippis staff 2394 1 Mar 2013 NC_020422.ffn
-rw-r--r-- 1 FrancescaDeFilippis staff 848808 28 Ago 2012 NS_000191.ffn
-rw-r--r-- 1 FrancescaDeFilippis staff 6684 28 Ago 2012 NS_000192.ffn
-rw-r--r-- 1 FrancescaDeFilippis staff 3869 28 Ago 2012 NS_000193.ffn
-rw-r--r-- 1 FrancescaDeFilippis staff 2394 28 Ago 2012 NS_000194.ffn
我想要得到这样的东西:
secondary_endosymbiont_of_Heteropsylla_cubana_Thao2000_uid172738: NC_018420.ffn
syncytium_symbiont_of_Diaphorina_citri_uid213384: NC_021885.ffn
syncytium_symbiont_of_Diaphorina_citri_uid213384: NC_021886.ffn
等等,所以我需要为每个文件重复文件夹的名称。
我怎样才能得到这个?
答案1
find .
或者
find . -ls
如果你想要详细信息...
使用 ls 进行单级(包含文件的目录,而不是其他目录):
ls -1d -- */*
对于一个简单的列表,
ls -ld -- */*
详细信息(第一个示例中是数字 1,第二个示例中是小写字母 L)。
答案2
这适用于任何 POSIX shell:
find <directory> -type f -exec sh -c '
for f do
printf "%s: %s\n" "${f%/*}" "${f##*/}"
done' sh {} +
此命令对每个文件(存储在变量 中的文件名f
)执行并显示目录 ( ${f%/*}
)、冒号和文件名 ( ${f##*/}'
)。
答案3
和zsh
:
for d (*(/N)) {for f ($d/*(N:t)) printf '%s: %s\n' $d $f; echo}
现在,如果您不关心排序或排除隐藏文件,或者目录之间是否有空行,那么(假设文件名不包含换行符),您可以简单地执行以下操作:
find . -path './*/*' -prune -print | sed 's|\./||;s|/|: |'
使用 GNU find
,您还可以执行以下操作:
find . -path './*/*' -prune -printf '%P\n' | sed 's|/|: |'
或者:
find . -path './*/*' -prune -printf '%h: %f\n'
如果你不关心领先的./
.
-path './*/*' -prune
仅报告深度为 2 的文件(但./a/b
不报告./a
或./a/b/c
)。通过 GNU(和其他一些)find
实现,您可以将其替换为-mindepth 2 -maxdepth 2
.
答案4
怎么样 。 。 。
find `pwd` -type f | perl -lane '@x=split(/\//); print "$x[$#x-1]: $x[$#x]";'