我必须完成以下任务:
对于给定的文件名列表和给定目录,为每个文件名打印出现的所有子目录。子目录将根据文件的创建日期以降序打印。
我不知道该怎么做
答案 0 :(得分:1)
因为提出个人喜爱的解决方案非常有趣,我将加入:
我知道你是在拖钓,但为了休闲读者的利益: 我承认那里的内联扩展确实不安全。我真的在展示我打算如何组合使用命令(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
答案 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
部分,您可以看到文件的创建(上次修改)时间。