我有一个脚本
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_重命名。我的意思是如果脚本找到文件aaaa
和bbbb
,则将它们重命名为old_aaa
和old_bbbb
。
有人可以帮助我吗?
答案 0 :(得分: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
当你满意它为你工作时,删除“回声”。
答案 1 :(得分:0)
使用选项-exec
:
find "$d" -maxdepth 1 -type f -amin -10 -exec mv "{}" "old_{}" \;
评论:
使用引号确保空格无关紧要。对于上面的循环,您应该使用
find "/home/users/"*"/personal/"*"/docs/MY" -type d
这不是绝对必要的,但最好把它变成一种习惯,这样你就不会忘记它当重要时。
另请注意,*
必须在外引号。
{}
周围的引号保护特殊字符,以便find
命令看到它们(否则,shell会尝试解释它们)。出于同样的原因,\
;
醇>
[编辑] 您可能需要向{}添加\! -name "old_*"
,这意味着“不要将已经以_old
开头的文件重命名为”。
答案 2 :(得分:0)
如果您不想要old_old_old_old _...文件,请尝试以下操作:
find "$d" -maxdepth 1 -type f -amin -10 -exec grep -q -v "old_" {} \; -exec mv "{}" "old_{}" \;
PS:我会对上一篇文章发表评论,但我不允许这样做。
答案 3 :(得分: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在评论中注意到的错误。