从find命令的目录列表中查找最新文件

时间:2020-10-05 13:53:08

标签: bash shell command-line

我使用find . -type d -name "Financials"在当前目录下找到所有名为“ Financials”的目录。由于我使用的是Mac,因此可以使用以下命令(从另一个stackoverflow问题中找到的内容)在当前目录中找到最新的修改文件:find . -type f -print0 | xargs -0 stat -f "%m %N" | sort -rn | head -1 | cut -f2- -d" "。我想做的是找到一种方法将第一个命令的结果传递给第二个命令-即在每个“金融”目录中找到最新修改的文​​件。有办法吗?

3 个答案:

答案 0 :(得分:1)

我认为您可以:

find . -type d -name "Financials" -print0 |
xargs -0 -I{} find {} -type f -print0 |
xargs -0 stat -f "%m %N" | sort -rn | head -1 | cut -f2- -d" "

但是,如果您想分别为每个目录,那么……为什么不循环它:

find . -type d -name "Financials" |
while IFS= read -r dir; do
   echo "newest file in $dir is $(
       find "$dir" -type f -print0 |
       xargs -0 stat -f "%m %N" | sort -rn | head -1 | cut -f2- -d" "
   )"
done

答案 1 :(得分:0)

将第2个文件+ xargs嵌套在第一个find + xargs内:

find . -type d -name "Financials" -print0 \
| xargs -0 sh -c '
    for d in "$@"; do
        find "$d" -type f -print0 \
        | xargs -0 stat -f "%m %N" \
        | sort -rn \
        | head -1 \
        | cut -f2- -d" "
    done
' sh

请注意sh -c '...' sh中的结尾“ sh” -该单词在shell脚本中变为“ $ 0”,以便for循环可以遍历所有目录。

答案 2 :(得分:0)

一种可以避免包含特殊字符的有趣文件名的可靠方法是:

  1. 找到此特定子目录中的所有文件,并提取inode编号和修改时间

    $ find . -type f -ipath '*/Financials/*' -printf "%T@ %i\n"
    
  2. 提取最小文件的inode编号

    $  ... | awk '($1>t){t=$1;i=$2}END{print i}'
    
  3. 按索引节点号搜索文件信息

    $ find . -type f -inum "$inode" '*/Financials/*'
    

所以这给你:

  $ inode="$(find . -type f -ipath '*/Financials/*' -printf "%T@ %i\n" | awk '($1>t){t=$1;i=$2}END{print i}')"
  $ find . -type f -inum "$inode" '*/Financials/*'
相关问题