如何列出包含文件的所有子目录

时间:2011-04-14 12:11:48

标签: linux file shell directory

我必须完成以下任务:

对于给定的文件名列表和给定目录,为每个文件名打印出现的所有子目录。子目录将根据文件的创建日期以降序打印。

我不知道该怎么做

5 个答案:

答案 0 :(得分:1)

因为提出个人喜爱的解决方案非常有趣,我将加入:

解决方案(扰流板)

@user unknown:

我知道你是在拖钓,但为了休闲读者的利益: 我承认那里的内联扩展确实不安全。我真的在展示我打算如何组合使用命令(ls,find,uniq)等。它可以安全:

find -type f -printf '%f\0' | sort -uz |
    xargs -0i -n1 find -name {} -printf "%f:%p\n"

格式化现在稍微不那么方便了(然后再次,如何使用路径名中的特殊字符格式化?)。关于这个问题的问题很少,所以......


最后一点:

the first read is already broken with (...) blanks in filenames

  • 不真实 while read仅针对换行符打破,请尝试:read line <<< "a b c" && echo "'$line'"

原始教学指针

使用

dirname
     a/b/c/file -> a/b/c
basename
     a/b/c/file -> file
ls -t / ls -tr
     sort files by timestamp; note that 'creation date' is likely a fob because hardly any filesystem stores these reliably (it is usually the last change date for the inode)

find -type f
find -type d
     find files or directories
sort | uniq
sort -u
     sort lines and remove adjacent (subsequent) duplicates

如果有帮助,请告诉我。除了指向UNIX命令的指针

之外,我还可以给你一个小小的提升

答案 1 :(得分:1)

for file in $(< filelist) 
do 
    find -name "$file" -printf "%C@ %h\n" | sort -rn | sed 's/^[0-9.]* //'
done 
  • $(&lt; filelist)是一个重定向,它避免了一个新进程(与cat相反)
  • printf%C @打印自1970年1月1日起的秒数
  • %h打印没有文件名的主要目录
  • sort -n对数字进行排序,-r反向顺序
  • sed删除排序后的时间

问题:

  • 从问题来看,没有迹象表明打印文件名本身,这对于现实世界的场景来说是不寻常的。这很容易解决。
  • 包含换行符的路径名处理不当,以及其他奇特的字符,例如垂直制表符,换页符等。

答案 2 :(得分:0)

您可以结合for(循环浏览文件)和find来搜索文件。

cat > filenames <<EOF
file-a
file-b
file-c
EOF

export DIR=dir-d

for filename in `cat filenames`; do find $DIR -name $filename ; done

查看“查找”手册页,了解您可以做些什么;您可以轻松运行其他命令(使用-exec)。

答案 3 :(得分:0)

文件的创建日期通常不可用。在标准文件系统上,您可以访问上次修改时间,上次访问时间以及上次更改元数据的时间。除了那个问题,这是一个很好的脚本来做其他部分:

#!/bin/sh

F=$(mktemp)
trap "rm -f $F" 0
find ${1?Usage: $(basename $0) path [file...]} > $F
shift
while test $# -gt 0; do
  grep $1 $F
  shift
done

这个脚本的一个很好的功能是它只运行一次查找。要进行排序,一种好的方法是打印要在其中排序到tempfile中的统计信息,然后简单地输出while循环的输出以进行排序。如评论中所述,grep不是特别可靠,因为它可能匹配不完全匹配的路径。

答案 4 :(得分:0)

它只适用于Linux,但那是在OP:

#!/bin/sh

for file in fileNameA fileNameB; do
  echo "File ${file} is in the following directories:"
  find sourceDir -type f -name ${file} -printf "%T@\t%h\n"|sort -rn|cut -f2
done

提示:如果省略cut -f2部分,您可以看到文件的创建(上次修改)时间。