【问题标题】:Rename files depending on age根据年龄重命名文件
【发布时间】:2023-03-30 19:18:01
【问题描述】:

我有一个脚本

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

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

有人可以帮我吗?

【问题讨论】:

标签: bash shell


【解决方案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

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

【讨论】:

  • 谢谢,脚本执行没有错误,但它无法更改文件:(我也没有看到来自“echo”的公告...
  • 你看到 any 输出了吗?您是否剪切并粘贴或重新输入(有错别字?)该代码?
  • 不,我不知道。但是在将参数更改为-amin -10 之后。有用!谢谢你。这是一个不错的脚本!
  • 我是这里的新用户,我看到我不允许投票,因为我需要声誉 15 :( 不过还是谢谢你一次!
【解决方案2】:

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

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

PS:我本来想评论之前的帖子,但我不被允许。

【讨论】:

  • 我也试过你的命令。但错误与我在 Aaron 改进 mv 中得到的相同:无法将 /home/users/*/personal/*/docs/MY/testfile.txt' 移动到 old_/home/users/*/personal/*/docs/MY/ testfile.txt': No such file or directory 它正在尝试重命名所有路径...如何避免这种情况?
【解决方案3】:

如下操作:

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 在 cmets 中记录的错误。

【讨论】:

  • 输入你写的第一个shell命令我得到错误:for d in $(find /home/users/*/personal/*/docs/MY -type d);确实找到 $d -maxdepth 1 -type f -amin -10 |重命名“s/()/old_\$1/”;完成调用:重命名为文件...
  • 更新错误后执行命令和上面的例子一样。为什么所有脚本都试图更改“路径”而不是创建文件。错误:mv:无法将 /home/users/*/personal/*/docs/MY/testfile.txt' 移动到 old_/home/users/*/personal/*/docs/MY/testfile.txt'
  • 使用xargs 代替read-print0 以避免出现奇怪字符的问题
  • 我已经再次更新了我的答案以解决您报告的问题,请尝试并评论是否有效。
  • 感谢更正,但看起来出现了不同的错误。 mv: cannot stat `': 没有这样的文件或目录
【解决方案4】:

使用选项-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 开头的文件”。

【讨论】:

  • 感谢您的解释,但出了点问题。脚本正在尝试重命名所有路径,而不仅仅是一个文件。我收到错误:mv: cannot move /home/users/*/personal/*/docs/MY/testfile.txt' to old_/home/users/*/personal/*/docs/MY/testfile.txt': No such file or directory ....任何想法如何纠正?
  • 您是否注意到必须将* 保留在引号之外?
  • 对不起,我错过了一个报价。我现在没有收到错误,但上传后新文件没有重命名。
  • 试试-amin +10(即“超过10分钟”)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-14
  • 1970-01-01
相关资源
最近更新 更多