1

我有一个脚本

for d in $(find /home/users/*/personal/*/docs/MY -type d); do
    find $d -maxdepth 1 -type f -amin -10
done

它将列出在 Linux 服务器中以 10 分钟为周期创建的 MY 目录中的所有文件。我正在寻找一种方法,通过添加前缀 old_ 来重命名所有这些搜索到的匹配条件的文件。我的意思是如果脚本找到文件aaaaand bbbb,然后将它们重命名为old_aaaand old_bbbb

有人可以帮助我吗?

4

4 回答 4

1

让我们find为您找到所有文件:

find /home/users/*/personal/*/docs/MY -type f -amin +10 -print0 |  
while IFS= read -r -d $'\0' path; do
    dir=$(dirname "$path")
    name=$(basename "$path")
    if [[ $name != old_* ]]; then
        echo mv "$path" "$dir/old_$name"
    fi
done

当您对它的工作感到满意时,删除“回声”。

于 2012-09-19T13:47:07.400 回答
0

执行以下操作:

for d in $(find /home/users/*/personal/*/docs/MY -type d); do
    find $d -maxdepth 1 -type f -amin -10 | { read bn; basename "$bn"; } | rename "s/()/old_\$1/"
done

另请注意,-amin -10指的是过去 10 分钟内访问的文件,包括过去 10 分钟内创建的文件,但也可能包含其他文件。

更新
另一种方法可能比上述方法更快,因为它使用mv命令重命名,因此不涉及正则表达式,如下所示:

for d in $(find /home/users/*/personal/*/docs/MY -type d); do
    find $d -maxdepth 1 -type f -amin -10 | { read bn; basename "$bn"; } | { read fn; mv "$fn" "old_$fn"; }
done

更新 2
我更新了上面的两个命令以修复 OP 在评论中指出的错误。

于 2012-09-19T12:33:13.333 回答
0

如果您不想要 old_old_old_old_... 文件,您应该尝试以下操作:

find "$d" -maxdepth 1 -type f -amin -10  -exec grep -q -v "old_" {} \; -exec mv "{}" "old_{}" \; 

PS:我会评论上一篇文章,但我不被允许。

于 2012-09-19T12:11:21.570 回答
0

使用选项-exec

find "$d" -maxdepth 1 -type f -amin -10 -exec mv "{}" "old_{}" \;

注释:

  1. 使用引号确保空格无关紧要。对于上面的循环,您应该使用

    find "/home/users/"*"/personal/"*"/docs/MY" -type d
    

    这不是绝对必要的,但最好把它变成一种习惯,这样你就不会在重要的时候忘记它。

    另请注意,*必须在引号之外。

  2. 周围的引号{}保护特殊字符,以便find命令看到它们(否则,shell 会尝试解释它们)。出于同样的原因,\;

[编辑]您可能想要在查找中添加一个\! -name "old_*",这意味着“不要重命名已经以_old”开头的文件。

于 2012-09-19T12:02:28.377 回答