按日期在目录中查找文件...然后重命名

时间:2014-11-20 04:32:55

标签: bash

我正试图找出一种方法来使用bash脚本: - 搜索目录 - 按创建日期标识文件 - 重命名该文件

我希望'使用':if,然后'脚本来完成这个。任何人都知道如何做到这一点???

示例:

如果'在/ current / path'搜索'file created 12-25-2000' 然后是mv / current / path / FILENAME / other / path / FILENAME-1

这就是我现在所拥有的,但它不起作用:

#!/bin/bash

touch --date "2000-12-24" /tmp/start
touch --date "2000-12-26" /tmp/end

if ls -l /current/path -type f -newer /tmp/start -not -newer /tmp/end

then mv /current/path/FILENAME-1 /other/path/FILENAME 

#Reapplying original FILENAME 

echo "Back to boring..."

fi

2 个答案:

答案 0 :(得分:1)

要查找/tmp及其子目录中修改日期为2000-12-25的所有文件并将其移至/other/path/,请尝试:

find /tmp -daystart -type f -newermt "2000-12-24"  ! -newermt "2000-12-25" -exec mv {} "/other/path/$(basename {})-1" \;

解释

  • /tmp

    开始查看/tmp目录及其子目录。这可以替换为您喜欢的任何其他路径或路径列表。

  • -daystart

    可选。计算从一天开始创建文件的日期,而不是现在之前24小时的倍数。

  • -newermt "2000-12-24" ! -newermt "2000-12-25"

    仅选择修改日期高于2000-12-24但不高于2000-12-25的文件。这仅选择2000-12-25中的文件。

  • -type f

    可选。仅选择常规文件。不要试图移动目录。

  • -exec mv {} "/other/path/$(basename {})-1" \;

    找到文件后,在其上执行此移动命令。查找文件的名称(包括查找它所需的路径元素)将替换{},无论它出现在何处。 $(basename {})获取没有路径的文件名。

    起初看起来有点奇怪find要求-exec这样的命令以分号结尾。为了防止外壳吃掉分号,必须将其分解。因此,命令末尾的\;

调试

如果事情没有按预期工作,请尝试不使用-exec子句:

find /tmp -daystart -type f -newermt "2000-12-24"  ! -newermt "2000-12-25"

不是移动文件,而是打印他们的名字。如果打印正确的名称,那么问题在于-exec子句。如果缺少所需的文件名,请尝试不使用更多子句。例如,这应列出/tmp及其子目录中的所有文件:

find /tmp

这应列出/tmp中早于2000-12-25的所有文件:

find /tmp -daystart ! -newermt "2000-12-25"

答案 1 :(得分:1)

有很多方法可以做到这一点。您使用touchtemp files在正确的轨道上设置了搜索的边界。使用find而不是ls可能会更好。以下脚本将target directorystart time作为参数,以搜索位于target dirstart time之间的end time (default = start time + 1 day)中的文件。如果任何文件落在给定的时间内,则将文件添加到数组中。然后,您可以根据需要使用数组中的文件名进行移动。

由于脚本使用find,您可以通过find定制选择,以满足几乎所有需求。必须在脚本中提供移动标准。这是一个简单的例子:

#!/bin/bash

## validate required input and provide usage information
[ -n "$1" -a -n "$2" ] || {
    printf "\nerror: insufficient input. Usage:  %s path start_date [end_date (end=start+1d)]\n\n" "${0//\//}"
    printf "  NOTE: date STRING -- any allowable formatt accepted by coreutils 'date -d=STRING'\n\n"
    printf "           examples -- 11/01/2014 or \"11/01/2014 10:25:30\" or 20141101\n\n"
    exit 1
}

## store input path and start time
path="$1"
starttm=$2

## set start and end date (end defaults to starttm + 1 day)
startd="$(date -d "$starttm" +%s)"
endd="$(date -d "${3:-$(date -d "$starttm + 1 day")}" +%s)"

## set temp dir
[ -d /tmp ] && tmpdir="/tmp" || tmpdir="$PWD"

## tempfiles start & end (to create with compare dates)
tfs="${tmpdir}/ttm_${startd}"
tfe="${tmpdir}/ttm_${endd}"

## create temp file with start and end dates
touch -t $(date -d "@${startd}" +%Y%m%d%H%M.%S) $tfs
touch -t $(date -d "@${endd}" +%Y%m%d%H%M.%S) $tfe

## fill array using find to select files between tempfile dates
file_array=( $(find "$path" -maxdepth 1 -type f -newer $tfs ! -newer $tfe) )

## cleanup - remove temp files
rm $tfs $tfe || printf "warning: failed to remove tempfiles '%s' or '%s'\n" "$tfs" "$tfe"

## rename files at will
if [ "${#file_array[@]}" -gt 0 ]; then
    for i in "${file_array[@]}"; do
        fdir="${i%/*}"
        ffn="${i##*/}"
        printf "  moving %-32s -> %s\n" "$i" "${fdir}/newname_${ffn}"
    done
fi

exit 0

用法(不带参数运行):

$ ./find_range_snip.sh

error: insufficient input. Usage:  .find_range_snip.sh path start_date [end_date (end=start+1d)]

  NOTE: date STRING -- any allowable formatt accepted by coreutils 'date -d=STRING'

           examples -- 11/01/2014 or "11/01/2014 10:25:30" or 20141101

测试目录:

ls -l ~/tmp
total 387224
drwxr-xr-x  3 david david        4096 Nov  3 15:51 asm
drwxr-xr-x 16 david dcr          4096 Jul 13  2010 fluxbox
drwxr-xr-x  3 david david        4096 Oct 13 13:42 log
-rw-r--r--  1 david david      159557 Jul 16 04:15 acpidumpfile.bin
-rw-r--r--  1 david david        1429 Jul 13 10:57 blderror.txt
-rw-r--r--  1 david david        7663 Aug 21 05:39 fc-list-fonts-sorted-no-path.txt
-rw-r--r--  1 david users          60 Jul 13 02:20 homelnk
-rw-r--r--  1 david david         870 Sep  6 03:32 junk.c
-rw-r--r--  1 david david       32323 Aug  1 21:53 knemo-no-essid.jpg
-rw-r--r--  1 david david       14082 Sep 19 18:29 rlfwiki.tbl.desc
-rw-r--r--  1 david david        2211 Jul 29 02:23 scrnbrightness.sh
-rw-r--r--  1 david david     7456152 Sep 19 13:22 tcpd.tar.xz
-rw-r--r--  1 david david     3371941 Sep 19 22:08 tcpdump-capt
-rw-r--r--  1 david david      589676 Sep 19 14:49 tcpdump.new.1000
-rw-r--r--  1 david david           0 Oct 26 02:38 test
-rw-r--r--  1 david david         595 Jul 23 21:25 tmpkernel315.txt
-rwxr-xr-x  1 david david       12694 Oct 13 17:44 tstvi
-rw-r--r--  1 david david         620 Oct 13 17:47 tstvi.c
-rw-r--r--  1 david david        3599 Jul 16 04:29 xrandr-output.txt

<强>输出:

$ ./find_range_snip.sh ~/tmp 09/19/2014
  moving /home/david/tmp/tcpd.tar.xz      -> /home/david/tmp/newname_tcpd.tar.xz
  moving /home/david/tmp/rlfwiki.tbl.desc -> /home/david/tmp/newname_rlfwiki.tbl.desc
  moving /home/david/tmp/tcpdump-capt     -> /home/david/tmp/newname_tcpdump-capt
  moving /home/david/tmp/tcpdump.new.1000 -> /home/david/tmp/newname_tcpdump.new.1000