批量重命名具有修改时间限制的文件

时间:2014-04-01 09:17:06

标签: bash batch-rename

我希望根据修改日期时间重命名多个(多个)文件。也就是说,我希望提供一个日期(比如2014-31-03),并且在该日期,将子字符串a替换为修改日期为的任何文件中的子字符串bc日期。

例如,假设ls -latr --time-style=long-iso的输出如下:

total 8
drwxrwxr-x 3 bach bach 4096 2014-04-01 10:02 ..
-rw-rw-r-- 1 bach bach    0 2014-03-31 10:02 a.1
-rw-rw-r-- 1 bach bach    0 2014-03-31 10:02 a.2
-rw-rw-r-- 1 bach bach    0 2014-03-31 10:02 bc.1
-rw-rw-r-- 1 bach bach    0 2014-04-01 10:02 a.3
-rw-rw-r-- 1 bach bach    0 2014-04-01 10:02 bc.2
-rw-rw-r-- 1 bach bach    0 2014-04-01 10:02 bc.3
drwxrwxr-x 2 bach bach 4096 2014-04-01 10:08 .

然后修改后的输出应如下:

total 8
drwxrwxr-x 3 bach bach 4096 2014-04-01 10:02 ..
-rw-rw-r-- 1 bach bach    0 2014-03-31 10:02 bc.1
-rw-rw-r-- 1 bach bach    0 2014-04-01 10:02 a.3
-rw-rw-r-- 1 bach bach    0 2014-04-01 10:02 bc.2
-rw-rw-r-- 1 bach bach    0 2014-04-01 10:02 bc.3
-rw-rw-r-- 1 bach bach    0 2014-04-01 10:12 bc.1
-rw-rw-r-- 1 bach bach    0 2014-04-01 10:12 bc.2
drwxrwxr-x 2 bach bach 4096 2014-04-01 10:12 .

我不关心文件名中有多个子串a外观的情况。如果它只替换第一次出现就没问题。如果它更容易,我也可以假设子字符串出现在文件名的开头,但我不能认为它是固定长度的。

2 个答案:

答案 0 :(得分:1)

此查找(GNU)应该有效:

find . -type f -newermt 2014-03-30 ! -newermt 2014-04-01 -exec bash -c 'f="$1"; n="bc.${f##*.}"; mv "$f" "$n"' - '{}' \; 

答案 1 :(得分:1)

这是在循环中使用find和bash参数扩展的另一个:

$ ls
a.file1.txt  a.file2.txt  a.file3.txt  b.file4.txt
b.file5.txt  b.file6.txt  c.file7.txt  c.file8.txt  c.file9.txt

$ files=($(find . -type f -newermt 2014-04-01 ! -newermt 2014-04-02))
$ for file in "${files[@]}"; do
> [[ "$file" =~ a. ]] && mv "$file" "${file/a./bc.}"
> done
$

$ ls
b.file4.txt  b.file5.txt  b.file6.txt  bc.file1.txt
bc.file2.txt  bc.file3.txt  c.file7.txt  c.file8.txt  c.file9.txt