我正试图找出一种方法来使用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
答案 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)
有很多方法可以做到这一点。您使用touch
和temp files
在正确的轨道上设置了搜索的边界。使用find
而不是ls
可能会更好。以下脚本将target directory
和start time
作为参数,以搜索位于target dir
和start 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