【问题标题】:Nice way to loop directorys and files循环目录和文件的好方法
【发布时间】:2013-10-28 11:48:17
【问题描述】:

我正在尝试遍历一组文件夹,如果其中一个(或多个)中的文件比特定日期新,它应该显示该文件夹和其中的文件,一些像这样;

(日期是一周前)

Folder 1
  file 1
*Folder 2 (no files matching the date, should not be visible/echo'ed)*
Folder 3
  file 1
  file 2
Folder 4
  file 1

如何做到这一点?我的示例代码是:

#!/opt/bin/bash
#
# CurrentTvList.sh
# File for generating a current list of stored tvshows on my nas
# Patrick Osterlund
# 

#set -x
#trap read debug

# Settings
#
NEWTMPFOLDER="/volume1/tmp/tvtemps/"
NEWTMPFILE="TmpTvlisting.txt"
SIMPLER=$NEWTMPFOLDER$NEWTMPFILE
SMALL=2
MEDIUM=14
LARGE=30

# Clear screen; remove later
clear

#check if dir exists
mkdir -p ${NEWTMPFOLDER}

#check if file exists
if [ -f $SIMPLER ];
then
   echo "File: $NEWTMPFILE exists in $NEWTMPFOLDER" $'\n'

   FILEDATE=$(date -r $SIMPLER)
    #Check if file is newer than the existing one
    if [[ $SIMPLER -nt $FILEDATE ]]; then
        echo "$SIMPLER is newer than $FILEDATE"
    else
        echo "file created $FILEDATE is newer than file created; $SIMPLER"
    fi
   echo "and it was created: $FILEDATE" #$'\n\n'
   echo "File was created: " > $SIMPLER 
   echo $FILEDATE >> $SIMPLER $'\n'
else
   echo "File $NEWTMPFILE does not exists in $NEWTMPFOLDER, creating it"
   touch $SIMPLER;
fi
# Mostly for checking if all went well:
echo "looking here:" $NEWTMPFOLDER;
echo "file: $NEWTMPFILE"

# Small list
echo "New shows last ${SMALL} days: " $'\n' >> $SIMPLER
find /volume2/Disk2/!Tv-Serier/ -type f -mtime -$SMALL -size +2048 -exec basename {} \; | sed 's/\.[^.]*$//'\
>> $SIMPLER

# Medium list
echo $'\n' "New shows last ${MEDIUM} days: " $'\n' >> $SIMPLER
find /volume2/Disk2/!Tv-Serier/ -type f -mtime -$MEDIUM -size +2048\
 -exec basename {} \; | sed 's/\.[^.]*$//' >> $SIMPLER | sort -df

# Not in use right now
# Large list
#echo $'\n' "New shows last ${LARGE} days: " $'\n' >> $SIMPLER
#find /volume2/Disk2/!Tv-Serier/ -type f -mtime -$LARGE -size +2048\
# -exec basename {} \; | sed 's/\.[^.]*$//' >> $SIMPLER | sort -df

【问题讨论】:

    标签: bash loops find directory


    【解决方案1】:

    您可以将-newerct 选项设置为find 列出当前目录中上周修改过的文件,如下所示:

    find . -maxdepth 1 -type f -newerct '1 week ago'
    

    这里-maxdepth 1将搜索限制在当前目录; -type f 只选择普通文件(不是子目录等),在 -newerct 中,c 表示“inode 更改时间”,t 表示“将下一个参数解释为 @ 理解的形式的直接日期规范987654322@"

    所以您的脚本可能如下所示:

    something | while read DIRECTORY; do {
        cd -- "$DIRECTORY"
        if find . -maxdepth 1 -type f -newerct '1 week ago' | grep -q .
        then
            printf "%s\n" "$DIRECTORY"
            printf "  %s\n" *
        fi
    } done
    

    something 是列出要搜索的目录的命令。

    我在上面的代码中假设你的意思是你在问题中写的:也就是说,如果目录中的 any 文件比一周新,那么你想列出所有目录中的文件。

    【讨论】:

    • newerct 显然在busybox 中不起作用:/ 但是不,我只想列出较新的文件,旧的文件对此不感兴趣。
    • 从“The utilities in BusyBox generally have fewer options than their full-featured GNU cousins”开始,在您的问题中提及这些细节可能对您有所帮助。同样,如果您只想列出较新的文件,您应该提到这一点。
    • 对不起,我对这个论坛有点新,将来会尝试提供更多信息:/
    猜你喜欢
    • 1970-01-01
    • 2013-10-06
    • 2013-09-20
    • 1970-01-01
    • 2020-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-11
    相关资源
    最近更新 更多